diff --git a/advanced_project_management_system/README.rst b/advanced_project_management_system/README.rst new file mode 100755 index 000000000..6570bf577 --- /dev/null +++ b/advanced_project_management_system/README.rst @@ -0,0 +1,49 @@ + .. image:: https://img.shields.io/badge/license-LGPL--3-green.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +Advanced project management system +================================== +All additional features of project module are in single module + +Configuration +============= +- No additional configuration required + +License +------- +General Public License, Version 3 (LGPL v3). +(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +* Developer: (V16) Sreeshanth V S, Jumana Jabin MP, + (V17) Kailas Krishna + Contact: odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if +your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit `Our Website `__ + +Further information +=================== +HTML Description: ``__ diff --git a/advanced_project_management_system/__init__.py b/advanced_project_management_system/__init__.py new file mode 100755 index 000000000..b7e1aa45e --- /dev/null +++ b/advanced_project_management_system/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import models +from . import report +from . import wizard diff --git a/advanced_project_management_system/__manifest__.py b/advanced_project_management_system/__manifest__.py new file mode 100755 index 000000000..fa531ce6d --- /dev/null +++ b/advanced_project_management_system/__manifest__.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +{ + 'name': "Advanced Project Management System", + "version": "17.0.1.0.0", + "category": "Project", + "summary": "Advanced Project Management System can handle projects," + "tasks, due dates, checklists", + "description": """Advanced Project Management System designed to streamline + every aspect of your projects. From handling projects and tasks to managing + due dates and checklists, this all-in-one solution simplifies project and + task management for you.""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['project', 'hr_timesheet'], + 'data': [ + 'security/advanced_project_management_system_security.xml', + 'security/ir.model.access.csv', + 'data/ir_cron_data.xml', + 'data/mail_template_data.xml', + 'data/ir_actions_server_data.xml', + 'data/ir_sequence_data.xml', + 'views/project_milestone_views.xml', + 'views/res_config_settings_views.xml', + 'views/project_checklist_views.xml', + 'views/project_task_checklist_views.xml', + 'views/project_task_views.xml', + 'views/project_task_checklist_template_views.xml', + 'views/project_checklist_template_views.xml', + 'views/project_category_views.xml', + 'views/project_project_views.xml', + 'views/ir_attachment_views.xml', + 'views/project_issue_views.xml', + 'report/project_project_template.xml', + 'report/project_task_template.xml', + 'report/ir_action_report.xml', + 'report/project_task_burnup_chart_report_views.xml', + 'report/project_task_velocity_chart_report_views.xml', + 'wizard/project_task_checklist_import_views.xml', + 'wizard/project_stage_update_views.xml', + 'wizard/project_task_mass_update_views.xml', + 'wizard/project_shortcut_views.xml' + ], + 'assets': { + 'web.assets_backend': { + 'advanced_project_management_system/static/src/scss/style.scss', + 'advanced_project_management_system/static/src/js/burnup_chart_search_model.js', + 'advanced_project_management_system/static/src/js/burnup_chart_model.js', + 'advanced_project_management_system/static/src/js/burnup_chart_view.js', + 'advanced_project_management_system/static/src/xml/burnup_chart_view.xml', + 'advanced_project_management_system/static/src/xml/chatter_templates.xml', + 'advanced_project_management_system/static/src/js/composer_patch.js', + 'advanced_project_management_system/static/src/js/velocity_chart_model.js', + 'advanced_project_management_system/static/src/js/velocity_chart_search_model.js', + 'advanced_project_management_system/static/src/js/velocity_chart_view.js', + 'advanced_project_management_system/static/src/xml/velocity_chart_view.xml', + }, + }, + 'images': ['static/description/banner.jpg'], + 'license': 'LGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/advanced_project_management_system/data/ir_actions_server_data.xml b/advanced_project_management_system/data/ir_actions_server_data.xml new file mode 100755 index 000000000..bc878d1a0 --- /dev/null +++ b/advanced_project_management_system/data/ir_actions_server_data.xml @@ -0,0 +1,25 @@ + + + + + + Mass Stage Update + + + code + + action = record.project_multi_stage_update() + + + + + Mass Update + + + code + + action = record.task_mass_update() + + + + diff --git a/advanced_project_management_system/data/ir_cron_data.xml b/advanced_project_management_system/data/ir_cron_data.xml new file mode 100755 index 000000000..65045b8fd --- /dev/null +++ b/advanced_project_management_system/data/ir_cron_data.xml @@ -0,0 +1,25 @@ + + + + + + Document Expire + + code + model.document_expire_notification() + 1 + days + -1 + + + + Task overdue notification + + code + model.task_overdue_notification() + 1 + days + -1 + + + diff --git a/advanced_project_management_system/data/ir_sequence_data.xml b/advanced_project_management_system/data/ir_sequence_data.xml new file mode 100755 index 000000000..3dec19c1f --- /dev/null +++ b/advanced_project_management_system/data/ir_sequence_data.xml @@ -0,0 +1,12 @@ + + + + + + Sequence + project.issue + PI + 3 + + + diff --git a/advanced_project_management_system/data/mail_template_data.xml b/advanced_project_management_system/data/mail_template_data.xml new file mode 100755 index 000000000..097fc01d2 --- /dev/null +++ b/advanced_project_management_system/data/mail_template_data.xml @@ -0,0 +1,116 @@ + + + + + + Document Expire Notification + + + {{object.company_id.email}} + {{object.partner_id.email}} + Document Expiry Notification for + {{object.name}} + + +

+ Dear Mr/Ms, +
+ Your document + + + + is expiring on + + + +

+ Thank you +

+
+
+ + + Document Expire Notification + + + {{object.company_id.email}} + {{object.document_email_to}} + Document Expiry Notification for + {{object.name}} + + +

+ Hi Team, +
+ The document + + + + is expiring on + + + + +

+ Thank you +

+
+
+ + + Task due Notification + + + {{object.company_id.email}} + {{object._get_user_emails()}} + Task Overdue notification + + +

+ Dear Employee +
+ Your overdue tasklist are + + + + + + + + + + + + + + + +
ProjectTaskDeadline Date
+ + + + + +
+ Thank you +

+
+
+
+
diff --git a/advanced_project_management_system/doc/RELEASE_NOTES.md b/advanced_project_management_system/doc/RELEASE_NOTES.md new file mode 100755 index 000000000..c873aa5fb --- /dev/null +++ b/advanced_project_management_system/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 30.03.2024 +#### Version 17.0.1.0.0 +#### ADD +- Initial commit for Advanced project management system diff --git a/advanced_project_management_system/models/__init__.py b/advanced_project_management_system/models/__init__.py new file mode 100755 index 000000000..822cadea3 --- /dev/null +++ b/advanced_project_management_system/models/__init__.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import ir_attachment +from . import project_project +from . import project_category +from . import project_checklist +from . import project_checklist_info +from . import project_checklist_template +from . import project_issue +from . import project_task +from . import project_task_checklist +from . import project_task_checklist_info +from . import project_task_checklist_template +from . import project_task_type +from . import res_config_settings diff --git a/advanced_project_management_system/models/ir_attachment.py b/advanced_project_management_system/models/ir_attachment.py new file mode 100755 index 000000000..9d07710ea --- /dev/null +++ b/advanced_project_management_system/models/ir_attachment.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models + + +class IrAttachment(models.Model): + """ Added document expiry information""" + _inherit = 'ir.attachment' + + expiry_date = fields.Date(string='Expiry Date', + help="for setting expiry date for the document") + expiry_notification = fields.Boolean(string='Expiry Date Notification', + help="For sending expiry notification") + partner_id = fields.Many2one('res.partner', string="partner", + help="For adding the partner ") + document_email_to = fields.Char( + default=lambda self: self.env['ir.config_parameter'].sudo().get_param( + 'res.config.settings.email'), string="Email to", + help="For getting owner email") + document_mai_customer = fields.Boolean( + default=lambda self: self.env['ir.config_parameter'].sudo().get_param( + 'res.config.settings.notify_customer'), string="Email to customer", + help="Notify email to customer ") + + def document_expire_notification(self): + """ Automatically sent email when the + document expiration date is over""" + if self.env['ir.config_parameter'].sudo().get_param( + 'res.config.settings.notify_customer'): + attachments = self.search([('expiry_date', '!=', None)]) + for attachment in attachments: + if attachment.expiry_date < fields.Date.today(): + mail_template = attachment.env.ref( + 'advanced_project_management_system.document_expire_notification_to_customer') + mail_template.send_mail(attachment.id, force_send=True) + attachments = self.search([('expiry_date', '!=', None)]) + for attachment in attachments: + if attachment.expiry_notification: + if attachment.expiry_date < fields.Date.today(): + mail_template = attachment.env.ref( + 'advanced_project_management_system.document_expire_notification_mail_template') + mail_template.send_mail(attachment.id, force_send=True) + + @api.onchange('res_id') + def _onchange_res_id(self): + """ Compute customer name and add to attachment from projects""" + attachments = self.search([('res_model', '=', 'project.project')]) + for attachment in attachments: + projects = self.env['project.project'].search( + [('id', '=', attachment.res_id)]) + if projects.partner_id: + attachment.partner_id = projects.partner_id.id diff --git a/advanced_project_management_system/models/project_category.py b/advanced_project_management_system/models/project_category.py new file mode 100755 index 000000000..bb27729cc --- /dev/null +++ b/advanced_project_management_system/models/project_category.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectCategory(models.Model): + """ Setting up the project category""" + _name = "project.category" + _description = "Project categories" + + name = fields.Char(string='Project Category', tracking=True, + help="Name of the category") + is_active = fields.Boolean(string='Active', + help="Check is it active or not ") diff --git a/advanced_project_management_system/models/project_checklist.py b/advanced_project_management_system/models/project_checklist.py new file mode 100755 index 000000000..400c33ed7 --- /dev/null +++ b/advanced_project_management_system/models/project_checklist.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectChecklist(models.Model): + """ Project checklist information""" + _name = "project.checklist" + _description = "Project checklist" + + name = fields.Char(string='Name', required=True, + name="name of the checklist") + description = fields.Char(string='Description', required=True, + help="Description about the checklist ") + company_id = fields.Many2one('res.company', string='Company', + required=True, help="Company information", + default=lambda self: self.env.company.id) diff --git a/advanced_project_management_system/models/project_checklist_info.py b/advanced_project_management_system/models/project_checklist_info.py new file mode 100755 index 000000000..484c4bb1b --- /dev/null +++ b/advanced_project_management_system/models/project_checklist_info.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectChecklistInfo(models.Model): + """ Project checklist details""" + _name = "project.checklist.info" + _description = "Project checklist information" + + checklist_id = fields.Many2one('project.checklist', + string='Name', + help="Project checklist details") + description = fields.Char(string='Description', + related='checklist_id.description', + help="description about the checklist") + project_id = fields.Many2one('project.project', string="Project", + help="details of the project") + date = fields.Date(string='Date', default=fields.Date.today(), + help="get the date ") + state = fields.Selection( + selection=[('new', 'New'), ('progres', 'In Progress'), + ('done', 'Done'), ('cancel', 'Cancel')], default='new', + readonly=False, string="Status", + help="Get information about the state") + + def action_set_checklist_complete(self): + """ Mark the checklist progress and completion""" + if self.state in ['new', 'progres']: + self.state = 'done' + self.project_id.checklist_progress += 100 / float( + len(self.search([('project_id', '=', self.project_id.id)]))) + + def action_set_checklist_close(self): + """ Checklist cancel details""" + self.state = 'cancel' diff --git a/advanced_project_management_system/models/project_checklist_template.py b/advanced_project_management_system/models/project_checklist_template.py new file mode 100755 index 000000000..041436ce5 --- /dev/null +++ b/advanced_project_management_system/models/project_checklist_template.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectChecklistTemplate(models.Model): + """ Project checklist template""" + _name = "project.checklist.template" + _description = "Project checklist template" + + name = fields.Char(string='Name', help="name of the template") + checklist_ids = fields.Many2many('project.checklist', + string='Checklist', + help="checklist information") diff --git a/advanced_project_management_system/models/project_issue.py b/advanced_project_management_system/models/project_issue.py new file mode 100755 index 000000000..effca06c7 --- /dev/null +++ b/advanced_project_management_system/models/project_issue.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models + + +class ProjectIssue(models.Model): + """ For managing project issues""" + _name = "project.issue" + _description = 'Project and task issue' + + user_id = fields.Many2one("res.users", string="Assigned to", + help="The person who is responsible to solve " + "the issue") + summary = fields.Text(string='Issue summary', help="Adding project issue") + email = fields.Char(string="Email", help="Email address") + project_id = fields.Many2one('project.project', string="project", + help="To know issue noticed in which project") + task_id = fields.Many2one('project.task', string="Task", + help="To know issue noticed in which task", + domain=[('project_id', '=', project_id)]) + priority = fields.Selection([('0', 'Low'), ('1', 'High')], default='0', + string="Priority") + tag_ids = fields.Many2many('project.tags', string='Tags', + help='Set the tags') + partner_id = fields.Many2one('res.partner', string="Contact", + help="Know about the contact details") + name = fields.Char(string='Number', default='new', + help='To track the issue reference') + description = fields.Text(string='Description', + help="To add the issue in detail") + extra_info = fields.Text(string="Extra Info", + help="To add some extra information") + state = fields.Selection([('new', 'New'), ('progress', 'In Progress'), + ('done', 'Done'), ('cancel', 'Cancel')], + default='new', string='State', + help='Project issue pipeline stages') + create_date = fields.Datetime(string="Create Date", + help='For tracking the record creation date', + default=fields.Datetime.now()) + + @api.model + def create(self, vals): + """ Added reference number""" + if vals.get('name', 'New'): + vals['name'] = self.env['ir.sequence'].next_by_code( + 'project.issue') + res = super(ProjectIssue, self).create(vals) + return res diff --git a/advanced_project_management_system/models/project_project.py b/advanced_project_management_system/models/project_project.py new file mode 100755 index 000000000..e8128f7b9 --- /dev/null +++ b/advanced_project_management_system/models/project_project.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +import json +from odoo import api, fields, models, _ + + +class ProjectProject(models.Model): + """ Added project documents,checklist,stage updates""" + _inherit = 'project.project' + + project_category_id = fields.Many2one('project.category', + string='Project Category', + help="For adding project category ") + document_count = fields.Integer(string='Documents', + compute='_compute_document_count', + help="For getting the document count") + project_stage_id = fields.Many2one('project.project.stage', + tracking=True, string='Stage', + help="Project stages") + project_checklist_info_ids = fields.One2many('project.checklist.info', + 'project_id', + help="Project checklist details", + string='Checklist') + checklist_progress = fields.Float(string="Progress", + help="For checklist progress bar ") + checklist_template_ids = fields.Many2many('project.checklist.template', + string='checklist template', + help="For getting checklist " + "template") + issue_count = fields.Integer(string="Project issue", + help="For getting project issue ", + compute="_compute_issue_count") + shortcut_ids = fields.One2many('project.shortcut', 'project_id', + string='Shortcuts') + url_shortcut = fields.Char(string="URL Shortcut", + compute="_compute_url_shortcut", + help="Enter the URL shortcut.") + is_active = fields.Boolean(string="Is Active", store=True, + help="Check this box if the URL is active.") + url_link = fields.Char(string="URL Link", help="Enter the URL link.") + url_name = fields.Char(string="URL Name", + help="Enter the name associated with the URL.") + + def open_project_creation_wizard(self): + """ Open the project creation wizard """ + return { + 'type': 'ir.actions.act_window', + 'res_model': 'project.project', + 'view_mode': 'form', + 'view_id': self.env.ref( + 'advanced_project_management_system.project.project.view.form.' + 'simplified').id, + 'target': 'current', + } + + @api.depends('url_link', 'url_name') + def _compute_url_shortcut(self): + """ Compute the URL shortcut and its activation status """ + for project in self: + if project.url_link: + project.is_active = True + project.url_shortcut = project.url_link + else: + project.url_shortcut = "Add Link" + project.is_active = False + + def open_url_shortcut(self): + """ Open the URL shortcut """ + for project in self: + if project.url_shortcut: + return { + 'name': self.url_name, + 'type': 'ir.actions.act_url', + 'url': project.url_shortcut, + 'target': 'self', + } + + def button_document(self): + """ Return document kanban for the project""" + return { + 'name': 'Documents', + 'type': 'ir.actions.act_window', + 'res_model': 'ir.attachment', + 'view_mode': 'kanban,form', + 'res_id': self._origin.id, + 'domain': [ + ('res_id', '=', self._origin.id), + ('res_model', '=', 'project.project') + ], + } + + def _compute_document_count(self): + """ Compute document count and return """ + for rec in self: + attachment_ids = self.env['ir.attachment'].search( + [('res_model', '=', 'project.project'), + ('res_id', '=', rec.id)]) + rec.document_count = len(attachment_ids) + + def project_multi_stage_update(self): + """ Return wizard to update the project stage""" + return { + 'type': 'ir.actions.act_window', + 'name': 'Mass Update', + 'view_mode': 'form', + 'target': 'new', + 'res_model': 'project.stage.update', + } + + @api.onchange('checklist_template_ids') + def _onchange_checklist_template_ids(self): + """ Updating checklist""" + check_list_id = self.env['project.checklist.template'].browse( + self.checklist_template_ids.ids) + if check_list_id: + for checklist_id in check_list_id.checklist_ids.ids: + self.update({ + 'project_checklist_info_ids': + [(0, 0, { + 'checklist_id': checklist_id + })] + }) + + def _compute_issue_count(self): + """ For getting project issue count""" + for rec in self: + issue_id = self.env['project.issue'].search( + [('project_id', '=', rec.id)]) + rec.issue_count = len(issue_id) + + def button_issue(self): + """Return project issues""" + return { + 'type': 'ir.actions.act_window', + 'name': 'Project Issues', + 'view_mode': 'tree,form', + 'res_model': 'project.issue', + 'domain': [('project_id', '=', self.id)] + } + + def _get_stat_buttons(self): + """ Get statistical buttons for the project """ + self.ensure_one() + buttons = super(ProjectProject, self)._get_stat_buttons() + if self.user_has_groups('project.group_project_user'): + buttons.append({ + 'icon': 'area-chart', + 'text': _('Burnup Chart'), + 'action_type': 'action', + 'action': 'advanced_project_management_system.action_project_task_burnup_chart_report', + 'additional_context': json.dumps({ + 'active_id': self.id, + }), + 'show': True, + 'sequence': 60, + }) + if self.user_has_groups('project.group_project_user'): + buttons.append({ + 'icon': 'line-chart', + 'text': _('Velocity Chart'), + 'action_type': 'action', + 'action': 'advanced_project_management_system.action_project_velocity_chart_report', + 'additional_context': json.dumps({ + 'active_id': self.id, + }), + 'show': True, + 'sequence': 60, + }) + return buttons + + def action_project_task_burnup_chart_report(self): + """ Open the Burnup Chart report for the project """ + action = self.env['ir.actions.act_window']._for_xml_id( + 'advanced_project_management_system' + '.action_project_task_burnup_chart_report') + action['display_name'] = _("%(name)s's Burnup Chart", name=self.name) + return action + + def action_project_velocity_chart_report(self): + """ Open the Velocity Chart report for the project """ + action = self.env['ir.actions.act_window']._for_xml_id( + 'advanced_project_management_system' + '.action_project_velocity_chart_report') + action['display_name'] = _("%(name)s's Velocity Chart", + name=self.name) + return action + + def action_open_shortcut(self): + """ Open the shortcut creation form """ + view_id = self.env.ref( + 'advanced_project_management_system.project_shortcut_view_form').id + return { + 'name': 'Add Custom Project Shortcut', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'project.shortcut', + 'views': [(view_id, 'form')], + 'type': 'ir.actions.act_window', + 'target': 'new', + } diff --git a/advanced_project_management_system/models/project_task.py b/advanced_project_management_system/models/project_task.py new file mode 100755 index 000000000..b7a90bcf1 --- /dev/null +++ b/advanced_project_management_system/models/project_task.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models + + +class ProjectTask(models.Model): + """ Added checklist and document details""" + _inherit = 'project.task' + + document_count = fields.Integer(string='Documents', + compute='_compute_document_count', + help="For getting document count") + checklist_template_ids = fields.Many2many( + 'project.task.checklist.template', + string='Checklist', help="For adding project checklist template") + checklist_info_ids = fields.One2many('project.task.checklist.info', + 'task_id', string="checklist info", + help="for getting project checklist " + "details") + checklist_progress = fields.Float(string='Checklist Completed', + colors="red,orange,yellow,green", + help="For tracking checklist progress", + max_value=1, min_value=0) + task_type = fields.Selection([ + ('task', 'Task'), + ('subtask', 'Subtask'), + ('bug', 'Bug'), + ], string='Task Type', default="task") + + def task_overdue_notification(self): + """ Scheduled action for email notification to + employee about task due """ + if self.env['ir.config_parameter'].sudo().get_param( + 'res.config.settings.is_overdue_notification'): + task_ids = self.search([]) + for task in task_ids: + if task.stage_id.name not in ( + 'Done', + 'Canceled') and task.date_deadline and task.date_deadline < fields.Date.today(): + mail_template = task.env.ref( + 'advanced_project_management_system.task_due_email_notification') + mail_template.send_mail(task.id, force_send=True) + + def _get_user_emails(self): + """ Return email ids of the employee""" + emails = [] + task_ids = self.search([('date_deadline', '<', fields.Date.today())]) + for task in task_ids: + if task.stage_id.name not in ('Done', 'Canceled'): + for user in task.user_ids: + emails.append(user.login) + return emails + + def _compute_document_count(self): + """ Compute document count and return """ + for rec in self: + attachment_ids = self.env['ir.attachment'].search( + [('res_model', '=', 'project.task'), ('res_id', '=', rec.id)]) + rec.document_count = len(attachment_ids) + + def button_task_document(self): + """ Return document kanban for the task""" + return { + 'name': 'Documents', + 'type': 'ir.actions.act_window', + 'res_model': 'ir.attachment', + 'view_mode': 'kanban,form', + 'res_id': self._origin.id, + 'domain': [ + ('res_id', '=', self._origin.id), + ('res_model', '=', 'project.task')], + } + + def task_mass_update(self): + """ Return wizard for updating task details""" + return { + 'name': 'Documents', + 'type': 'ir.actions.act_window', + 'res_model': 'project.task.mass.update', + 'target': 'new', + 'view_mode': 'form', + } + + @api.onchange('stage_id') + def _onchange_stage_id(self): + """ While changing task stage task will automatically assign to + users from task stage""" + if self.stage_id.user_ids: + self.user_ids = self.stage_id.user_ids + + @api.onchange('checklist_template_ids') + def _onchange_checklist_template_ids(self): + """When the `checklist_template_ids` field is modified, this method is + triggered to update the `checklist_info_ids` field. + It browses the selected checklist templates and for each checklist item in these templates, + it creates a new checklist info record linked to the current task. + """ + check_list_id = self.env['project.task.checklist.template'].browse( + self.checklist_template_ids.ids) + if check_list_id: + for checklist_id in check_list_id.checklist_ids.ids: + self.update({ + 'checklist_info_ids': + [(0, 0, { + 'checklist_id': checklist_id + })] + }) diff --git a/advanced_project_management_system/models/project_task_checklist.py b/advanced_project_management_system/models/project_task_checklist.py new file mode 100755 index 000000000..f688d8528 --- /dev/null +++ b/advanced_project_management_system/models/project_task_checklist.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectChecklist(models.Model): + """Task checklist details""" + _name = "project.task.checklist" + _description = "Task Custom Checklist" + + name = fields.Char(string='Name', required=True, + help="name of the checklist") + description = fields.Char(string='Description', required=True, + help="Description of the checklist") + company_id = fields.Many2one('res.company', string='Company', + required=True, + default=lambda self: self.env.company.id, + help="For getting company details") diff --git a/advanced_project_management_system/models/project_task_checklist_info.py b/advanced_project_management_system/models/project_task_checklist_info.py new file mode 100755 index 000000000..f801bb325 --- /dev/null +++ b/advanced_project_management_system/models/project_task_checklist_info.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models, _ +from odoo.exceptions import ValidationError + + +class ProjectTaskChecklistInfo(models.Model): + """ Task checklist details""" + _name = "project.task.checklist.info" + _description = "Task checklist information" + + checklist_id = fields.Many2one('project.task.checklist', + string='Name', help="checklist") + description = fields.Char(string='Description', + related='checklist_id.description', + help="Description of the checklist info ") + task_id = fields.Many2one('project.task', string="Task", + help="Task details") + checklist_progress = fields.Integer(string="progress", + help="For tracking the checklist " + "progress and completion") + date = fields.Date(string='Date', default=fields.Date.today(), + help="Get the date information") + state = fields.Selection( + selection=[('new', 'New'), ('progres', 'In Progress'), + ('done', 'Done'), ('cancel', 'Cancel')], default='new', + string="Status", help="get the status of the checklist ") + + def action_set_checklist_complete(self): + """ Managing the checklist progress and completion""" + if self.state in ['new', 'progres']: + checklist_template_id = self.env[ + 'project.task.checklist.template'].search( + [('id', 'in', self.task_id.checklist_template_ids.ids)]) + if len(checklist_template_id.checklist_ids.ids) > 0: + self.task_id.checklist_progress += 100 / float( + len(checklist_template_id.checklist_ids.ids)) + self.state = 'done' + else: + raise ValidationError(_("Please add checklist")) + + def action_set_checklist_close(self): + """ Checklist cancel info """ + self.state = 'cancel' diff --git a/advanced_project_management_system/models/project_task_checklist_template.py b/advanced_project_management_system/models/project_task_checklist_template.py new file mode 100755 index 000000000..fa8cf5760 --- /dev/null +++ b/advanced_project_management_system/models/project_task_checklist_template.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectTaskChecklistTemplate(models.Model): + """Task checklist template""" + _name = "project.task.checklist.template" + _description = "Task checklist template" + + name = fields.Char(string='Name', help="name of the template") + checklist_ids = fields.Many2many('project.task.checklist', + string='Checklist', + help="To get the checklist details") diff --git a/advanced_project_management_system/models/project_task_type.py b/advanced_project_management_system/models/project_task_type.py new file mode 100644 index 000000000..9628523d9 --- /dev/null +++ b/advanced_project_management_system/models/project_task_type.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProjectTaskType(models.Model): + """ Added user information""" + _inherit = 'project.task.type' + + user_ids = fields.Many2many('res.users', string='Assign Multiple Users', + help="We can assign multiple users ") diff --git a/advanced_project_management_system/models/res_config_settings.py b/advanced_project_management_system/models/res_config_settings.py new file mode 100755 index 000000000..3d02629da --- /dev/null +++ b/advanced_project_management_system/models/res_config_settings.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + """ Added document expiry notification expiry mail details """ + _inherit = "res.config.settings" + + is_project_category = fields.Boolean( + string='Enable Project Category', + help="Enabling project category", + config_parameter='advanced_project_management_system.is_project_category') + document_expiry_notification = fields.Boolean( + string='Document Expiry Notification', + help="For sending document expiry notification", + config_parameter='advanced_project_management_system.document_expiry_notification') + notify_customer = fields.Boolean( + string='Notify Customer', + help="For notifying the customer", + config_parameter='advanced_project_management_system.notify_customer') + on_expiry_notification = fields.Boolean( + string='On Expiry Date Notification', help="Sent expiry notification", + config_parameter='advanced_project_management_system.on_expiry_notification') + email = fields.Char( + string='Notify Email to', help="Get email id", + config_parameter='advanced_project_management_system.email') + notify_days = fields.Integer( + string='Notify After Expiry Date', + help="Notification sent before these days", + config_parameter='advanced_project_management_system.notify_days') + is_overdue_notification = fields.Boolean( + string='Overdue Notification?', + help="For sending overdue notification", + config_parameter='advanced_project_management_system.is_overdue_notification') + notification_before = fields.Integer( + string='Notification Days', + help="Sent notification before these days", + config_parameter='advanced_project_management_system.notification_before') + + @api.onchange('is_project_category') + def _onchange_is_project_category(self): + """Handles the addition or removal of the current user from the + `group_project_category` based on the state of `is_project_category`.""" + groups = self.env.ref( + 'advanced_project_management_system.group_project_category') + if self.is_project_category: + groups.write({'users': [(4, self.env.user.id)]}) + else: + groups.write({'users': [(3, self.env.user.id)]}) diff --git a/advanced_project_management_system/report/__init__.py b/advanced_project_management_system/report/__init__.py new file mode 100644 index 000000000..4bfd5f41a --- /dev/null +++ b/advanced_project_management_system/report/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import project_task_burnup_chart_report +from . import project_task_velocity_chart_report diff --git a/advanced_project_management_system/report/ir_action_report.xml b/advanced_project_management_system/report/ir_action_report.xml new file mode 100755 index 000000000..b82f3285d --- /dev/null +++ b/advanced_project_management_system/report/ir_action_report.xml @@ -0,0 +1,25 @@ + + + + + Print Project + project.project + qweb-pdf + advanced_project_management_system.project_details_report + project_report + 'Project Details' + + report + + + + Print Task + project.task + qweb-pdf + advanced_project_management_system.task_details_report + task_report + 'Task Details' + + report + + diff --git a/advanced_project_management_system/report/project_project_template.xml b/advanced_project_management_system/report/project_project_template.xml new file mode 100755 index 000000000..01bb6d864 --- /dev/null +++ b/advanced_project_management_system/report/project_project_template.xml @@ -0,0 +1,102 @@ + + + + + diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report.py b/advanced_project_management_system/report/project_task_burnup_chart_report.py new file mode 100644 index 000000000..4dd677fb4 --- /dev/null +++ b/advanced_project_management_system/report/project_task_burnup_chart_report.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from collections import defaultdict +from odoo import fields, models, _ + + +class ProjectTaskBurnupChartReport(models.AbstractModel): + """This model defines the Burnup Chart report for project tasks. """ + _name = 'project.task.burnup.chart.report' + _description = 'Burnup Chart' + _auto = True + + project_id = fields.Many2one('project.project', readonly=True) + date = fields.Datetime(string='Date', readonly=True, + help='The date of data entry') + completed_count = fields.Integer(string='Completed Tasks', readonly=True, + help='The number of completed tasks') + total_count = fields.Integer(string='Total Tasks', readonly=True, + help='The total number of tasks') + + def _read_group(self, domain, groupby=(), aggregates=(), having=(), + offset=0, limit=None, order=None): + data = [] + project_id = self._context.get('active_id') + + if groupby: + tasks = self.env['project.task'].search([ + ('project_id', '=', project_id), + ('stage_id.name', '=', 'Done') + ]) + + task_counts = defaultdict(lambda: defaultdict(int)) + task_names = defaultdict(list) + + for task in tasks: + completion_date = task.date_deadline or task.create_date.date() + + if isinstance(completion_date, fields.date): + completion_date = fields.datetime.combine(completion_date, + fields.datetime.min.time()) + start_date = task.create_date.date() + + if task.stage_id.name == 'Done': + month_year = completion_date + task_counts[month_year]['Total'] += 1 + + if start_date != completion_date: + task_counts[month_year]['Start'] += 1 + task_names[month_year].append(task.name) + + for month_year, counts in task_counts.items(): + data.append((month_year, task_names[month_year], counts['Total'])) + return data diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml new file mode 100644 index 000000000..860051f29 --- /dev/null +++ b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml @@ -0,0 +1,39 @@ + + + + + project.task.burnup.chart.report.view.search + project.task.burnup.chart.report + + + + + + + + + project.task.burnup.chart.report.view.graph + project.task.burnup.chart.report + + + + + + + + + + burnup Chart + project.task.burnup.chart.report + graph + + {'search_default_project_id': active_id, 'search_default_date': 1, 'search_default_stage': 1, 'search_default_filter_date': 1} + [('project_id', '!=', False)] + +

+ No data yet! +

+

Analyze how quickly your team is completing your project's tasks and check if everything is progressing according to plan.

+
+
+
\ No newline at end of file diff --git a/advanced_project_management_system/report/project_task_template.xml b/advanced_project_management_system/report/project_task_template.xml new file mode 100755 index 000000000..20597f901 --- /dev/null +++ b/advanced_project_management_system/report/project_task_template.xml @@ -0,0 +1,112 @@ + + + + + diff --git a/advanced_project_management_system/report/project_task_velocity_chart_report.py b/advanced_project_management_system/report/project_task_velocity_chart_report.py new file mode 100644 index 000000000..65b4bea05 --- /dev/null +++ b/advanced_project_management_system/report/project_task_velocity_chart_report.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from collections import defaultdict +from odoo import api, fields, models, _ + + +class ProjectVelocityChartReport(models.AbstractModel): + """ + Abstract model for the Velocity Chart report. + This model is used to calculate and display the Velocity Chart report + for a specific project and task. + """ + _name = 'project.velocity.chart.report' + _description = 'Velocity Chart' + + date = fields.Date(string='Sprint Start Date', readonly=True, + help="The start date of the sprint.") + completed_story_points = fields.Float(string='Completed Story Points', + readonly=True, + help="The total story points" + " completed in the sprint.") + + @api.model + def _read_group(self, domain, groupby=(), aggregates=(), having=(), + offset=0, limit=None, order=None): + """Compute grouped data for the Velocity Chart report.""" + data = [] + project_id = self._context.get('active_id') + if groupby: + tasks = self.env['project.task'].search([ + ('project_id', '=', project_id), + ('stage_id.name', '=', 'Done') + ]) + completed_within_deadline_count = defaultdict( + lambda: defaultdict(int)) + completed_names = defaultdict(list) + for task in tasks: + sprint_start_date = task.create_date.date() + completion_date = task.date_deadline or task.create_date.date() + if isinstance(completion_date, fields.date): + completion_date = fields.datetime.combine(completion_date, + fields.datetime.min.time()) + + if task.stage_id.name == 'Done': + month_year = completion_date + completed_within_deadline_count[month_year]['Total'] += 1 + if sprint_start_date != completion_date: + completed_within_deadline_count[month_year][ + 'Start'] += 1 + completed_names[month_year].append(task.name) + for month_year, counts in completed_within_deadline_count.items(): + data.append((month_year, completed_names[month_year], counts['Total'])) + return data diff --git a/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml b/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml new file mode 100644 index 000000000..ccb4dfd94 --- /dev/null +++ b/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml @@ -0,0 +1,50 @@ + + + + + project.velocity.chart.report.view.search + project.velocity.chart.report + + + + + + + + + project.velocity.chart.report.view.graph + project.velocity.chart.report + + + + + + + + + + Velocity Chart + project.velocity.chart.report + graph + + {'search_default_project_id': active_id, + 'search_default_date': 1} + + [('project_id', '!=', False)] + +

+ No data yet! +

+

Analyze your project's velocity over time with the Velocity + Chart. +

+
+
+
diff --git a/advanced_project_management_system/security/advanced_project_management_system_security.xml b/advanced_project_management_system/security/advanced_project_management_system_security.xml new file mode 100755 index 000000000..f6ca87f62 --- /dev/null +++ b/advanced_project_management_system/security/advanced_project_management_system_security.xml @@ -0,0 +1,12 @@ + + + + + Access Project Document + + + + Access Project Category Menu + + + diff --git a/advanced_project_management_system/security/ir.model.access.csv b/advanced_project_management_system/security/ir.model.access.csv new file mode 100755 index 000000000..31b313088 --- /dev/null +++ b/advanced_project_management_system/security/ir.model.access.csv @@ -0,0 +1,15 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_project_task_checklist,access.project.task.checklist,model_project_task_checklist,base.group_user,1,1,1,1 +access_project_task_checklist_import,access.project.task.checklist.import,model_project_task_checklist_import,base.group_user,1,1,1,1 +access_project_task_checklist_info,access.project.task.checklist.info,model_project_task_checklist_info,base.group_user,1,1,1,1 +access_project_category,access.project.category,model_project_category,base.group_user,1,1,1,1 +access_project_stage_update,access.project.stage.update,model_project_stage_update,base.group_user,1,1,1,1 +access_project_task_mass_update,access.project.task.mass.update,model_project_task_mass_update,base.group_user,1,1,1,1 +access_project_task_checklist_template,access.project.task.checklist.template,model_project_task_checklist_template,base.group_user,1,1,1,1 +access_project_checklist,access.project.checklist,model_project_checklist,base.group_user,1,1,1,1 +access_project_checklist_template,access.project.checklist.template,model_project_checklist_template,base.group_user,1,1,1,1 +access_project_checklist_info,access.project.checklist.info,model_project_checklist_info,base.group_user,1,1,1,1 +access_project_issue,access.project.issue,model_project_issue,base.group_user,1,1,1,1 +access_project_task_burnup_chart_report,access.burnup.chart.report,model_project_task_burnup_chart_report,base.group_user,1,1,1,1 +advanced_project_management_system.access_project_shortcut,access.project.shortcut,advanced_project_management_system.model_project_shortcut,base.group_user,1,1,1,1 +access_project_velocity_chart_report,access.velocity.chart.report,model_project_velocity_chart_report,base.group_user,1,1,1,1 diff --git a/advanced_project_management_system/static/csv/task_checklist.csv b/advanced_project_management_system/static/csv/task_checklist.csv new file mode 100755 index 000000000..ec832f66c --- /dev/null +++ b/advanced_project_management_system/static/csv/task_checklist.csv @@ -0,0 +1,5 @@ +Name,Description +checklist A,checklist A +checklist B,checklist B +checklist C,checklist C +checklist D,checklist D \ No newline at end of file diff --git a/advanced_project_management_system/static/description/assets/icons/capture (1).png b/advanced_project_management_system/static/description/assets/icons/capture (1).png new file mode 100644 index 000000000..8824deafc Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/capture (1).png differ diff --git a/advanced_project_management_system/static/description/assets/icons/check.png b/advanced_project_management_system/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/check.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/chevron.png b/advanced_project_management_system/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/chevron.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/cogs.png b/advanced_project_management_system/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/cogs.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/consultation.png b/advanced_project_management_system/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/consultation.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/ecom-black.png b/advanced_project_management_system/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/ecom-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/education-black.png b/advanced_project_management_system/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/education-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/hotel-black.png b/advanced_project_management_system/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/hotel-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/img.png b/advanced_project_management_system/static/description/assets/icons/img.png new file mode 100644 index 000000000..70197f477 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/img.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/license.png b/advanced_project_management_system/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/license.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/lifebuoy.png b/advanced_project_management_system/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/lifebuoy.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png b/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/photo-capture.png b/advanced_project_management_system/static/description/assets/icons/photo-capture.png new file mode 100644 index 000000000..06c111758 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/photo-capture.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/pos-black.png b/advanced_project_management_system/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/pos-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/puzzle.png b/advanced_project_management_system/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/puzzle.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/restaurant-black.png b/advanced_project_management_system/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/restaurant-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/service-black.png b/advanced_project_management_system/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/service-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/trading-black.png b/advanced_project_management_system/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/trading-black.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/training.png b/advanced_project_management_system/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/training.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/update.png b/advanced_project_management_system/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/update.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/user.png b/advanced_project_management_system/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/user.png differ diff --git a/advanced_project_management_system/static/description/assets/icons/wrench.png b/advanced_project_management_system/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/advanced_project_management_system/static/description/assets/icons/wrench.png differ diff --git a/advanced_project_management_system/static/description/assets/misc/Cybrosys R.png b/advanced_project_management_system/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 000000000..da4058087 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/misc/Cybrosys R.png differ diff --git a/advanced_project_management_system/static/description/assets/misc/email.svg b/advanced_project_management_system/static/description/assets/misc/email.svg new file mode 100644 index 000000000..15291cdc3 --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/advanced_project_management_system/static/description/assets/misc/phone.svg b/advanced_project_management_system/static/description/assets/misc/phone.svg new file mode 100644 index 000000000..b7bd7f251 --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/advanced_project_management_system/static/description/assets/misc/star (1) 2.svg b/advanced_project_management_system/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/advanced_project_management_system/static/description/assets/misc/support (1) 1.svg b/advanced_project_management_system/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 000000000..7d37a8f30 --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/advanced_project_management_system/static/description/assets/misc/support-email.svg b/advanced_project_management_system/static/description/assets/misc/support-email.svg new file mode 100644 index 000000000..eb70370d6 --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/advanced_project_management_system/static/description/assets/misc/tick-mark.svg b/advanced_project_management_system/static/description/assets/misc/tick-mark.svg new file mode 100644 index 000000000..2dbb40187 --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg b/advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 000000000..0bfaf8fc6 --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/advanced_project_management_system/static/description/assets/misc/whatsapp.svg b/advanced_project_management_system/static/description/assets/misc/whatsapp.svg new file mode 100644 index 000000000..b618aea1d --- /dev/null +++ b/advanced_project_management_system/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/advanced_project_management_system/static/description/assets/modules/1.png b/advanced_project_management_system/static/description/assets/modules/1.png new file mode 100644 index 000000000..164eb62c7 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/1.png differ diff --git a/advanced_project_management_system/static/description/assets/modules/2.jpg b/advanced_project_management_system/static/description/assets/modules/2.jpg new file mode 100644 index 000000000..d3c201230 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/2.jpg differ diff --git a/advanced_project_management_system/static/description/assets/modules/3.png b/advanced_project_management_system/static/description/assets/modules/3.png new file mode 100644 index 000000000..f2b7d217a Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/3.png differ diff --git a/advanced_project_management_system/static/description/assets/modules/4.jpg b/advanced_project_management_system/static/description/assets/modules/4.jpg new file mode 100644 index 000000000..37e17adae Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/4.jpg differ diff --git a/advanced_project_management_system/static/description/assets/modules/5.png b/advanced_project_management_system/static/description/assets/modules/5.png new file mode 100644 index 000000000..ec2c10a19 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/5.png differ diff --git a/advanced_project_management_system/static/description/assets/modules/6.jpg b/advanced_project_management_system/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..878810bd4 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/modules/6.jpg differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/1.png b/advanced_project_management_system/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..2740312a0 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/1.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/10.png b/advanced_project_management_system/static/description/assets/screenshots/10.png new file mode 100644 index 000000000..a56762804 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/10.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/11.png b/advanced_project_management_system/static/description/assets/screenshots/11.png new file mode 100644 index 000000000..b360ac55f Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/11.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/12.png b/advanced_project_management_system/static/description/assets/screenshots/12.png new file mode 100644 index 000000000..ce53ae648 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/12.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/13.png b/advanced_project_management_system/static/description/assets/screenshots/13.png new file mode 100644 index 000000000..246820c8c Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/13.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/14.png b/advanced_project_management_system/static/description/assets/screenshots/14.png new file mode 100644 index 000000000..aba46e073 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/14.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/15.png b/advanced_project_management_system/static/description/assets/screenshots/15.png new file mode 100644 index 000000000..f08c28701 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/15.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/16.png b/advanced_project_management_system/static/description/assets/screenshots/16.png new file mode 100644 index 000000000..1a33b98aa Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/16.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/17.png b/advanced_project_management_system/static/description/assets/screenshots/17.png new file mode 100644 index 000000000..98d2d2daa Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/17.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/18.png b/advanced_project_management_system/static/description/assets/screenshots/18.png new file mode 100644 index 000000000..526ed08c0 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/18.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/19.png b/advanced_project_management_system/static/description/assets/screenshots/19.png new file mode 100644 index 000000000..799300c38 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/19.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/2.png b/advanced_project_management_system/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..9652182a9 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/2.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/20.png b/advanced_project_management_system/static/description/assets/screenshots/20.png new file mode 100644 index 000000000..56c1980cb Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/20.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/21.png b/advanced_project_management_system/static/description/assets/screenshots/21.png new file mode 100644 index 000000000..555cb4df4 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/21.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/22.png b/advanced_project_management_system/static/description/assets/screenshots/22.png new file mode 100644 index 000000000..3ab9de2cb Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/22.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/23.png b/advanced_project_management_system/static/description/assets/screenshots/23.png new file mode 100644 index 000000000..bd3166700 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/23.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/24.png b/advanced_project_management_system/static/description/assets/screenshots/24.png new file mode 100644 index 000000000..b63903881 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/24.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/25.png b/advanced_project_management_system/static/description/assets/screenshots/25.png new file mode 100644 index 000000000..7734e4ddd Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/25.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/26.png b/advanced_project_management_system/static/description/assets/screenshots/26.png new file mode 100644 index 000000000..19f643356 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/26.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/27.png b/advanced_project_management_system/static/description/assets/screenshots/27.png new file mode 100644 index 000000000..f05956f6e Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/27.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/28.png b/advanced_project_management_system/static/description/assets/screenshots/28.png new file mode 100644 index 000000000..99749eee6 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/28.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/29.png b/advanced_project_management_system/static/description/assets/screenshots/29.png new file mode 100644 index 000000000..9fad332e4 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/29.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/3.png b/advanced_project_management_system/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..6ee8e92a5 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/3.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/30.png b/advanced_project_management_system/static/description/assets/screenshots/30.png new file mode 100644 index 000000000..79e2fee12 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/30.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/31.png b/advanced_project_management_system/static/description/assets/screenshots/31.png new file mode 100644 index 000000000..d9b142453 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/31.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/32.png b/advanced_project_management_system/static/description/assets/screenshots/32.png new file mode 100644 index 000000000..86a10bf10 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/32.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/33.png b/advanced_project_management_system/static/description/assets/screenshots/33.png new file mode 100644 index 000000000..838c4af18 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/33.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/4.png b/advanced_project_management_system/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..2c86cfc5e Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/4.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/5.png b/advanced_project_management_system/static/description/assets/screenshots/5.png new file mode 100644 index 000000000..60f167651 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/5.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/6.png b/advanced_project_management_system/static/description/assets/screenshots/6.png new file mode 100644 index 000000000..4ef30eac8 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/6.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/7.png b/advanced_project_management_system/static/description/assets/screenshots/7.png new file mode 100644 index 000000000..f0409895c Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/7.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/8.png b/advanced_project_management_system/static/description/assets/screenshots/8.png new file mode 100644 index 000000000..a7fe2e8b4 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/8.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/9.png b/advanced_project_management_system/static/description/assets/screenshots/9.png new file mode 100644 index 000000000..df333071e Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/9.png differ diff --git a/advanced_project_management_system/static/description/assets/screenshots/hero.gif b/advanced_project_management_system/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..d0b5536d0 Binary files /dev/null and b/advanced_project_management_system/static/description/assets/screenshots/hero.gif differ diff --git a/advanced_project_management_system/static/description/banner.jpg b/advanced_project_management_system/static/description/banner.jpg new file mode 100644 index 000000000..133604830 Binary files /dev/null and b/advanced_project_management_system/static/description/banner.jpg differ diff --git a/advanced_project_management_system/static/description/icon.png b/advanced_project_management_system/static/description/icon.png new file mode 100644 index 000000000..a3dda6d3a Binary files /dev/null and b/advanced_project_management_system/static/description/icon.png differ diff --git a/advanced_project_management_system/static/description/index.html b/advanced_project_management_system/static/description/index.html new file mode 100755 index 000000000..c3c7ac678 --- /dev/null +++ b/advanced_project_management_system/static/description/index.html @@ -0,0 +1,1166 @@ + + + + + + + Odoo App 3 Index + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+
+
+
+
+
+

Advanced Project Management System

+

+ All and Additional Features of Project Module are in Single Module. +

+
+ +
+
+
+
+
+

+ Key Highlights +

+
+
+
+
+
+ +
+
+

+ Option to Manage Project and Task Checklist

+
+
+
+
+
+
+ +
+
+

+ Manage Milestone for Project and Task

+
+
+
+
+
+
+ +
+
+

+ BurnUp Chart of a Project

+
+
+
+
+
+
+ +
+
+

+ Velocity Chart Report of a Project

+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+

+ 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. +

+
+
+
+
+
+
+
    +
  • + Use Checklist Template and Checklist Import to Checklist for Various Project and Tasks. +
  • +
  • + Manage Documents Related to Project and Task. +
  • +
  • + Option to Import Checklist. +
  • + +
  • + Available in Odoo 16.0 Community & Enterprise. +
  • +
  • + We can Categories the Project in to Different Categories. +
  • +
  • + Option to Track and Manage Project Issues. +
  • +
  • + Can Add Comments to Project. +
  • +
  • + We can Update Multiple Task Details Simultaneously. +
  • +
  • + We can Update Multiple Project Stages Simultaneously. +
  • +
+
+
+
+
+
+
Version + 17.0.1.0.0|Released on:29th March 2024 +
+

+ Initial Commit for Advanced Project Management System.

+
+
+
+
+
+
+
+

+ Related Products

+
+
+ +
+
+

+ Our Services

+ +
+
+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Customization

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Support

+
+
+
+
+
+
+ service-icon +
+
+

Hire + Odoo Developer

+
+
+
+
+ +
+
+ service-icon +
+
+

Odoo + Integration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Migration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Consultancy

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Licensing Consultancy

+
+
+
+
+
+
+

+ Our Industries

+ +
+
+
+
+
+
+ +

Trading

+

Easily procure and sell your products

+
+
+
+
+ +

POS

+

Easy configuration and convivial experience

+
+
+
+
+ +

+ Education

+

A platform for educational management

+
+
+
+
+ +

+ Manufacturing

+

Plan, track and schedule your operations

+
+
+
+
+ +

E-commerce & + Website

+

Mobile friendly, awe-inspiring product pages

+
+
+
+
+ +

Service + Management

+

Keep track of services and invoice

+
+
+
+
+ +

+ Restaurant

+

Run your bar or restaurant methodically

+
+
+
+
+ +

Hotel + Management

+

An all-inclusive hotel management application

+
+
+
+
+
+
+

+ Support

+
+
+
+
+
+
+
+ +
+ Need + Help? +

Got + questions or need help? Get in touch.

+
odoo@cybrosys.com +
+
+
+
+
+
+
+
+ +
+ WhatsApp +

Say hi to + us on WhatsApp!

+
+91 + 99456767686 +
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/advanced_project_management_system/static/src/js/burnup_chart_model.js b/advanced_project_management_system/static/src/js/burnup_chart_model.js new file mode 100644 index 000000000..757a4a976 --- /dev/null +++ b/advanced_project_management_system/static/src/js/burnup_chart_model.js @@ -0,0 +1,90 @@ +/** @odoo-module **/ +import { GraphModel } from "@web/views/graph/graph_model"; +import { _t } from "@web/core/l10n/translation"; + +export class BurnupChartModel extends GraphModel { + /** + * @override + */ + setup(params) { + super.setup(params); + this.stageSeqAndNamePerId = {}; + } + + /** + * Fetch the sequence of each stage in the project. This function alters this.stageSeqAndNamePerId + * @protected + * @param {Object} context + */ + async _fetchStageInfo(context) { + const searchDomain = + !context.active_id || !context.default_project_id + ? [] + : [["project_ids", "in", context.active_id]]; + const data = await this.orm.webSearchRead("project.task.type", searchDomain, { + specification: { + name: {}, + sequence: {}, + }, + }); + const stageSeqAndNamePerId = {}; + for (const { id, name, sequence } of data.records) { + stageSeqAndNamePerId[id] = { name, sequence }; + } + return stageSeqAndNamePerId; + } + + /** + * @param {SearchParams} searchParams + */ + async load(searchParams) { + const { context, groupBy } = searchParams; + + if (groupBy.includes("stage_id")) { + if (context.stage_name_and_sequence_per_id && context.default_project_id) { + this.stageSeqAndNamePerId = context.stage_name_and_sequence_per_id; + } else { + // if the stage_name_and_sequence_per_id wasn't given by the action (for example if the page is simply reloaded) + this.stageSeqAndNamePerId = await this._fetchStageInfo(context); + } + } else { + this.stageSeqAndNamePerId = {}; + } + await super.load(searchParams); + } + + /** + * @override + */ + _prepareData() { + super._prepareData(); + const { groupBy } = this.searchParams; + const { mode } = this.metaData; + if (mode === "line" && groupBy.includes("stage_id")) { + this.data.datasets = sortBy(this.data.datasets, (dataSet) => { + const firstIdentifier = [...dataSet.identifiers][0]; + const group = Object.assign(...JSON.parse(firstIdentifier)); + const val = group.stage_id; + if (Array.isArray(val)) { + return this.stageSeqAndNamePerId[val[0]]?.sequence || -1; + } + return -1; + }); + } + } + + /** + * @protected + * @override + */ + async _loadDataPoints(metaData) { + if (!metaData.measures) { + metaData.measures = {}; + } + if (!metaData.measures.__completed) { + metaData.measures.__completed = {}; + } + metaData.measures.__completed.string = _t('Completed Tasks'); + return super._loadDataPoints(metaData); + } +} diff --git a/advanced_project_management_system/static/src/js/burnup_chart_search_model.js b/advanced_project_management_system/static/src/js/burnup_chart_search_model.js new file mode 100644 index 000000000..0f02a2206 --- /dev/null +++ b/advanced_project_management_system/static/src/js/burnup_chart_search_model.js @@ -0,0 +1,126 @@ +/** @odoo-module */ +import { useService } from "@web/core/utils/hooks"; +import { SearchModel } from "@web/search/search_model"; +import { _t } from "@web/core/l10n/translation"; + +export class BurnupChartSearchModel extends SearchModel { + /** + * @override + */ + setup(services) { + this.notificationService = useService("notification"); + super.setup(...arguments); + } + /** + * @override + */ + async load(config) { + await super.load(...arguments); + // Store date and stage_id searchItemId in the SearchModel for reuse in other functions. + for (const searchItem of Object.values(this.searchItems)) { + if (['dateGroupBy', 'groupBy'].includes(searchItem.type)) { + if (this.stageIdSearchItemId && this.dateSearchItemId) { + return; + } + switch (searchItem.fieldName) { + case 'date': + this.dateSearchItemId = searchItem.id; + break; + case 'stage_id': + this.stageIdSearchItemId = searchItem.id; + break; + } + } + } + } + /** + * @override + */ + deactivateGroup(groupId) { + // Prevent removing Date & Stage group by from the search + if (this.searchItems[this.stageIdSearchItemId].groupId == groupId && this.searchItems[this.dateSearchItemId].groupId) { + this._addGroupByNotification(_t("Date and Stage")); + return; + } + super.deactivateGroup(groupId); + } + /** + * @override + */ + toggleDateGroupBy(searchItemId, intervalId) { + // Ensure that there is always one and only one date group by selected. + if (searchItemId === this.dateSearchItemId) { + let filtered_query = []; + let triggerNotification = false; + for (const queryElem of this.query) { + if (queryElem.searchItemId !== searchItemId) { + filtered_query.push(queryElem); + } else if (queryElem.intervalId === intervalId) { + triggerNotification = true; + } + } + if (filtered_query.length !== this.query.length) { + this.query = filtered_query; + if (triggerNotification) { + this._addGroupByNotification(_t("Date")); + } + } + } + super.toggleDateGroupBy(...arguments); + } + /** + * @override + */ + toggleSearchItem(searchItemId) { + // Ensure that stage_id is always selected. + if (searchItemId === this.stageIdSearchItemId + && this.query.some(queryElem => queryElem.searchItemId === searchItemId)) { + this._addGroupByNotification(_t("Stage")); + return; + } + super.toggleSearchItem(...arguments); + } + /** + * Adds a notification relative to the group by constraint of the Burnup Chart. + * @param fieldName The field name(s) the notification has to be related to. + * @private + */ + _addGroupByNotification(fieldName) { + const notif = _t("The Burnup Chart must be grouped by"); + this.notificationService.add( + `${notif} ${fieldName}`, + { type: "danger" } + ); + } + /** + * @override + */ + async _notify() { + // Ensure that we always group by date firstly and by stage_id secondly + let stageIdIndex = -1; + let dateIndex = -1; + for (const [index, queryElem] of this.query.entries()) { + if (stageIdIndex !== -1 && dateIndex !== -1) { + break; + } + switch (queryElem.searchItemId) { + case this.dateSearchItemId: + dateIndex = index; + break; + case this.stageIdSearchItemId: + stageIdIndex = index; + break; + } + } + if (stageIdIndex > 0) { + if (stageIdIndex > dateIndex) { + dateIndex += 1; + } + this.query.splice(0, 0, this.query.splice(stageIdIndex, 1)[0]); + } + if (dateIndex > 0) { + this.query.splice(0, 0, this.query.splice(dateIndex, 1)[0]); + } + await super._notify(...arguments); + } +} diff --git a/advanced_project_management_system/static/src/js/burnup_chart_view.js b/advanced_project_management_system/static/src/js/burnup_chart_view.js new file mode 100644 index 000000000..5d8c4c311 --- /dev/null +++ b/advanced_project_management_system/static/src/js/burnup_chart_view.js @@ -0,0 +1,20 @@ +/** @odoo-module **/ +import { BurnupChartModel } from "./burnup_chart_model"; +import { graphView } from "@web/views/graph/graph_view"; +import { registry } from "@web/core/registry"; +import { BurnupChartSearchModel } from "./burnup_chart_search_model"; + +const viewRegistry = registry.category("views"); + +// Define a Burnup Chart graph view +const burnupChartGraphView = { + ...graphView, + buttonTemplate: "project.BurnupChartView.Buttons", + hideCustomGroupBy: true, + Model: BurnupChartModel, + searchMenuTypes: graphView.searchMenuTypes.filter(menuType => menuType !== "comparison"), + SearchModel: BurnupChartSearchModel, +}; + +// Register the Burnup Chart view in the viewRegistry +viewRegistry.add("burnup_chart", burnupChartGraphView); diff --git a/advanced_project_management_system/static/src/js/composer_patch.js b/advanced_project_management_system/static/src/js/composer_patch.js new file mode 100644 index 000000000..b6eee4af0 --- /dev/null +++ b/advanced_project_management_system/static/src/js/composer_patch.js @@ -0,0 +1,35 @@ +/* @odoo-module */ +import { Composer } from "@mail/core/common/composer"; +import { _t } from "@web/core/l10n/translation"; +import { patch } from "@web/core/utils/patch"; + +patch(Composer.prototype, { + get placeholder() { + if (this.thread && this.thread.model !== "discuss.channel" && !this.props.placeholder) { + if (this.props.type === "message") { + return _t("Send a message to followers…"); + }else if(this.props.type === "comment") { + return _t("Add a comment here…"); + } else { + return _t("Log an internal note…"); + } + } + return super.placeholder; + }, + get SEND_TEXT() { + return this.props.type === "note" ? _t("Log") : this.props.type === "message" ? _t("Send") : _t("Comment"); + }, + async sendMessage() { + await this.processMessage(async (value) => { + const postData = { + attachments: this.props.composer.attachments, + isNote: this.props.type === "note" || this.props.type === "comment", + mentionedChannels: this.props.composer.mentionedChannels, + mentionedPartners: this.props.composer.mentionedPartners, + cannedResponseIds: this.props.composer.cannedResponses.map((c) => c.id), + parentId: this.props.messageToReplyTo?.message?.id, + }; + await this._sendMessage(value, postData); + }); + } +}); diff --git a/advanced_project_management_system/static/src/js/velocity_chart_model.js b/advanced_project_management_system/static/src/js/velocity_chart_model.js new file mode 100644 index 000000000..ed39f4578 --- /dev/null +++ b/advanced_project_management_system/static/src/js/velocity_chart_model.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ +import { GraphModel } from "@web/views/graph/graph_model"; +import { registry } from "@web/core/registry"; +import { _t } from "@web/core/l10n/translation"; + +// Define a custom model 'VelocityChartModel' that extends 'GraphModel' +export class VelocityChartModel extends GraphModel { + constructor() { + super(...arguments); + this.modelName = "project.velocity.chart.report"; + } + /** + * @protected + * @override + */ + async _loadDataPoints(metaData) { + if (!metaData.measures) { + metaData.measures = {}; + } + if (!metaData.measures.__completed) { + metaData.measures.__completed = {}; + } + metaData.measures.__completed.string = _t('Done Tasks'); + return super._loadDataPoints(metaData); +} +} +registry.category("models").add("velocity_chart_model", VelocityChartModel); diff --git a/advanced_project_management_system/static/src/js/velocity_chart_search_model.js b/advanced_project_management_system/static/src/js/velocity_chart_search_model.js new file mode 100644 index 000000000..ca8df24c0 --- /dev/null +++ b/advanced_project_management_system/static/src/js/velocity_chart_search_model.js @@ -0,0 +1,87 @@ +/** @odoo-module */ +import { useService } from "@web/core/utils/hooks"; +import { SearchModel } from "@web/search/search_model"; +import { _t } from "@web/core/l10n/translation"; + +// Define a custom search model 'VelocityChartSearchModel' that extends 'SearchModel' +export class VelocityChartSearchModel extends SearchModel { + /** + * @override + */ + setup(services) { + this.notificationService = useService("notification"); + super.setup(...arguments); + } + /** + * @override + */ + async load(config) { + await super.load(...arguments); + // Store date searchItemId in the SearchModel for reuse in other functions. + for (const searchItem of Object.values(this.searchItems)) { + if (searchItem.type === 'dateGroupBy') { + if (this.dateSearchItemId) { + return; + } + if (searchItem.fieldName === 'date') { + this.dateSearchItemId = searchItem.id; + } + } + } + } + /** + * @override + */ + toggleDateGroupBy(searchItemId, intervalId) { + // Ensure that there is always one and only one date group by selected. + if (searchItemId === this.dateSearchItemId) { + let filtered_query = []; + let triggerNotification = false; + for (const queryElem of this.query) { + if (queryElem.searchItemId !== searchItemId) { + filtered_query.push(queryElem); + } else if (queryElem.intervalId === intervalId) { + triggerNotification = true; + } + } + if (filtered_query.length !== this.query.length) { + this.query = filtered_query; + if (triggerNotification) { + this._addGroupByNotification(_t("Date")); + } + } + } + super.toggleDateGroupBy(...arguments); + } + /** + * Adds a notification relative to the group by constraint of the Velocity Chart. + * @param fieldName The field name(s) the notification has to be related to. + * @private + */ + _addGroupByNotification(fieldName) { + const notif = _t("The Velocity Chart must be grouped by"); + this.notificationService.add( + `${notif} ${fieldName}`, + { type: "danger" } + ); + } + /** + * @override + */ + async _notify() { + // Ensure that we always group by date + let dateIndex = -1; + for (const [index, queryElem] of this.query.entries()) { + if (dateIndex !== -1) { + break; + } + if (queryElem.searchItemId === this.dateSearchItemId) { + dateIndex = index; + } + } + if (dateIndex > 0) { + this.query.splice(0, 0, this.query.splice(dateIndex, 1)[0]); + } + await super._notify(...arguments); + } +} diff --git a/advanced_project_management_system/static/src/js/velocity_chart_view.js b/advanced_project_management_system/static/src/js/velocity_chart_view.js new file mode 100644 index 000000000..8f1961241 --- /dev/null +++ b/advanced_project_management_system/static/src/js/velocity_chart_view.js @@ -0,0 +1,16 @@ +/** @odoo-module **/ +import { VelocityChartModel } from "./velocity_chart_model"; +import { graphView } from "@web/views/graph/graph_view"; +import { registry } from "@web/core/registry"; +import { VelocityChartSearchModel } from "./velocity_chart_search_model"; +const viewRegistry = registry.category("views"); +// Define a Velocity Chart graph view +const velocityChartGraphView = { + ...graphView, + buttonTemplate: "project.VelocityChartView.Buttons", + hideCustomGroupBy: true, + Model: VelocityChartModel, + searchMenuTypes: graphView.searchMenuTypes.filter(menuType => menuType !== "comparison"), + SearchModel: VelocityChartSearchModel, +}; +viewRegistry.add("velocity_chart", velocityChartGraphView); diff --git a/advanced_project_management_system/static/src/scss/style.scss b/advanced_project_management_system/static/src/scss/style.scss new file mode 100644 index 000000000..9c5bec7f0 --- /dev/null +++ b/advanced_project_management_system/static/src/scss/style.scss @@ -0,0 +1,3 @@ +.url_button { + width: 100px; +} \ No newline at end of file diff --git a/advanced_project_management_system/static/src/xml/burnup_chart_view.xml b/advanced_project_management_system/static/src/xml/burnup_chart_view.xml new file mode 100644 index 000000000..ed5d523d5 --- /dev/null +++ b/advanced_project_management_system/static/src/xml/burnup_chart_view.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/advanced_project_management_system/static/src/xml/chatter_templates.xml b/advanced_project_management_system/static/src/xml/chatter_templates.xml new file mode 100644 index 000000000..b5909ada3 --- /dev/null +++ b/advanced_project_management_system/static/src/xml/chatter_templates.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + +
+ To: + +
+
+ + + + +
+
+
diff --git a/advanced_project_management_system/static/src/xml/velocity_chart_view.xml b/advanced_project_management_system/static/src/xml/velocity_chart_view.xml new file mode 100644 index 000000000..96305aaf8 --- /dev/null +++ b/advanced_project_management_system/static/src/xml/velocity_chart_view.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/advanced_project_management_system/static/xls/task_checklist.xlsx b/advanced_project_management_system/static/xls/task_checklist.xlsx new file mode 100755 index 000000000..540886fa7 Binary files /dev/null and b/advanced_project_management_system/static/xls/task_checklist.xlsx differ diff --git a/advanced_project_management_system/views/ir_attachment_views.xml b/advanced_project_management_system/views/ir_attachment_views.xml new file mode 100755 index 000000000..e0905e671 --- /dev/null +++ b/advanced_project_management_system/views/ir_attachment_views.xml @@ -0,0 +1,18 @@ + + + + + ir.attachment.view.form.inherit.advanced.project.management.system + ir.attachment + extension + + + + + + + + + + + diff --git a/advanced_project_management_system/views/project_category_views.xml b/advanced_project_management_system/views/project_category_views.xml new file mode 100755 index 000000000..b6354e66e --- /dev/null +++ b/advanced_project_management_system/views/project_category_views.xml @@ -0,0 +1,51 @@ + + + + + project.category.view.tree + project.category + + + + + + + + + + project.category.view.form + project.category + +
+ + + + + + + + + + +
+
+
+ + + Project Category + project.category + tree,form + +

+ Project Category +

+
+
+ + + +
diff --git a/advanced_project_management_system/views/project_checklist_template_views.xml b/advanced_project_management_system/views/project_checklist_template_views.xml new file mode 100755 index 000000000..f3e4caa41 --- /dev/null +++ b/advanced_project_management_system/views/project_checklist_template_views.xml @@ -0,0 +1,53 @@ + + + + + project.checklist.template.view.tree + project.checklist.template + + + + + + + + + + project.checklist.template.view.form + project.checklist.template + +
+ + + + + + + + + + +
+
+
+ + + project Checklist template + project.checklist.template + tree,form + +

+ Project Checklist template +

+
+
+ + + +
diff --git a/advanced_project_management_system/views/project_checklist_views.xml b/advanced_project_management_system/views/project_checklist_views.xml new file mode 100755 index 000000000..dfc92075f --- /dev/null +++ b/advanced_project_management_system/views/project_checklist_views.xml @@ -0,0 +1,52 @@ + + + + + project.checklist.view.tree + project.checklist + + + + + + + + + + + project.checklist.view.form + project.checklist + +
+ + + + + + + + + + + +
+
+
+ + + Project Custom Checklist + project.checklist + tree,form + +

+ Project Custom Checklist +

+
+
+ + + +
diff --git a/advanced_project_management_system/views/project_issue_views.xml b/advanced_project_management_system/views/project_issue_views.xml new file mode 100755 index 000000000..e5c6d3d11 --- /dev/null +++ b/advanced_project_management_system/views/project_issue_views.xml @@ -0,0 +1,112 @@ + + + + + project.issue.view.tree + project.issue + + + + + + + + + + + + + + + + project.issue.view.form + project.issue + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + project.issue.view.kanban + project.issue + + + > + + +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ + + Project Issue + project.issue + tree,form,kanban + +

+ Project Issue +

+
+
+ + + +
diff --git a/advanced_project_management_system/views/project_milestone_views.xml b/advanced_project_management_system/views/project_milestone_views.xml new file mode 100755 index 000000000..b5dae2575 --- /dev/null +++ b/advanced_project_management_system/views/project_milestone_views.xml @@ -0,0 +1,79 @@ + + + + + project.milestone.view.tree + project.milestone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project.task.view.form.inherit.advanced.project.management.system + + project.task + extension + + + + + + + + + + + + + + + + + + +