From 05293288e0f4663401812afbffd979c7c99c7229 Mon Sep 17 00:00:00 2001
From: RisvanaCybro
Date: Wed, 17 Apr 2024 00:25:04 +0530
Subject: [PATCH] Apr 17: [ADD] Initial Commit
'advanced_project_management_system'
---
advanced_project_management_system/README.rst | 49 +
.../__init__.py | 24 +
.../__manifest__.py | 85 ++
.../data/ir_actions_server_data.xml | 25 +
.../data/ir_cron_data.xml | 25 +
.../data/ir_sequence_data.xml | 12 +
.../data/mail_template_data.xml | 116 ++
.../doc/RELEASE_NOTES.md | 6 +
.../models/__init__.py | 34 +
.../models/ir_attachment.py | 71 +
.../models/project_category.py | 33 +
.../models/project_checklist.py | 36 +
.../models/project_checklist_info.py | 55 +
.../models/project_checklist_template.py | 33 +
.../models/project_issue.py | 67 +
.../models/project_project.py | 219 ++++
.../models/project_task.py | 126 ++
.../models/project_task_checklist.py | 37 +
.../models/project_task_checklist_info.py | 63 +
.../models/project_task_checklist_template.py | 33 +
.../models/project_task_type.py | 30 +
.../models/res_config_settings.py | 69 +
.../report/__init__.py | 23 +
.../report/ir_action_report.xml | 25 +
.../report/project_project_template.xml | 102 ++
.../project_task_burnup_chart_report.py | 72 +
...project_task_burnup_chart_report_views.xml | 39 +
.../report/project_task_template.xml | 112 ++
.../project_task_velocity_chart_report.py | 72 +
...oject_task_velocity_chart_report_views.xml | 50 +
...ced_project_management_system_security.xml | 12 +
.../security/ir.model.access.csv | 15 +
.../static/csv/task_checklist.csv | 5 +
.../description/assets/icons/capture (1).png | Bin 0 -> 36623 bytes
.../static/description/assets/icons/check.png | Bin 0 -> 3676 bytes
.../description/assets/icons/chevron.png | Bin 0 -> 310 bytes
.../static/description/assets/icons/cogs.png | Bin 0 -> 1377 bytes
.../description/assets/icons/consultation.png | Bin 0 -> 1458 bytes
.../description/assets/icons/ecom-black.png | Bin 0 -> 576 bytes
.../assets/icons/education-black.png | Bin 0 -> 733 bytes
.../description/assets/icons/hotel-black.png | Bin 0 -> 911 bytes
.../static/description/assets/icons/img.png | Bin 0 -> 1173 bytes
.../description/assets/icons/license.png | Bin 0 -> 1095 bytes
.../description/assets/icons/lifebuoy.png | Bin 0 -> 1199 bytes
.../assets/icons/manufacturing-black.png | Bin 0 -> 673 bytes
.../assets/icons/photo-capture.png | Bin 0 -> 10898 bytes
.../description/assets/icons/pos-black.png | Bin 0 -> 878 bytes
.../description/assets/icons/puzzle.png | Bin 0 -> 653 bytes
.../assets/icons/restaurant-black.png | Bin 0 -> 905 bytes
.../assets/icons/service-black.png | Bin 0 -> 839 bytes
.../assets/icons/trading-black.png | Bin 0 -> 427 bytes
.../description/assets/icons/training.png | Bin 0 -> 627 bytes
.../description/assets/icons/update.png | Bin 0 -> 1225 bytes
.../static/description/assets/icons/user.png | Bin 0 -> 988 bytes
.../description/assets/icons/wrench.png | Bin 0 -> 1205 bytes
.../description/assets/misc/Cybrosys R.png | Bin 0 -> 82191 bytes
.../static/description/assets/misc/email.svg | 33 +
.../static/description/assets/misc/phone.svg | 3 +
.../description/assets/misc/star (1) 2.svg | 9 +
.../description/assets/misc/support (1) 1.svg | 9 +
.../description/assets/misc/support-email.svg | 6 +
.../description/assets/misc/tick-mark.svg | 17 +
.../description/assets/misc/whatsapp 1.svg | 9 +
.../description/assets/misc/whatsapp.svg | 33 +
.../static/description/assets/modules/1.png | Bin 0 -> 48084 bytes
.../static/description/assets/modules/2.jpg | Bin 0 -> 99870 bytes
.../static/description/assets/modules/3.png | Bin 0 -> 88247 bytes
.../static/description/assets/modules/4.jpg | Bin 0 -> 77827 bytes
.../static/description/assets/modules/5.png | Bin 0 -> 99945 bytes
.../static/description/assets/modules/6.jpg | Bin 0 -> 80372 bytes
.../description/assets/screenshots/1.png | Bin 0 -> 72109 bytes
.../description/assets/screenshots/10.png | Bin 0 -> 186761 bytes
.../description/assets/screenshots/11.png | Bin 0 -> 161527 bytes
.../description/assets/screenshots/12.png | Bin 0 -> 80233 bytes
.../description/assets/screenshots/13.png | Bin 0 -> 38523 bytes
.../description/assets/screenshots/14.png | Bin 0 -> 147468 bytes
.../description/assets/screenshots/15.png | Bin 0 -> 79203 bytes
.../description/assets/screenshots/16.png | Bin 0 -> 39903 bytes
.../description/assets/screenshots/17.png | Bin 0 -> 81302 bytes
.../description/assets/screenshots/18.png | Bin 0 -> 37544 bytes
.../description/assets/screenshots/19.png | Bin 0 -> 107671 bytes
.../description/assets/screenshots/2.png | Bin 0 -> 33315 bytes
.../description/assets/screenshots/20.png | Bin 0 -> 90961 bytes
.../description/assets/screenshots/21.png | Bin 0 -> 35923 bytes
.../description/assets/screenshots/22.png | Bin 0 -> 80181 bytes
.../description/assets/screenshots/23.png | Bin 0 -> 53470 bytes
.../description/assets/screenshots/24.png | Bin 0 -> 84825 bytes
.../description/assets/screenshots/25.png | Bin 0 -> 45312 bytes
.../description/assets/screenshots/26.png | Bin 0 -> 89422 bytes
.../description/assets/screenshots/27.png | Bin 0 -> 92473 bytes
.../description/assets/screenshots/28.png | Bin 0 -> 92360 bytes
.../description/assets/screenshots/29.png | Bin 0 -> 66911 bytes
.../description/assets/screenshots/3.png | Bin 0 -> 34096 bytes
.../description/assets/screenshots/30.png | Bin 0 -> 73795 bytes
.../description/assets/screenshots/31.png | Bin 0 -> 59409 bytes
.../description/assets/screenshots/32.png | Bin 0 -> 125936 bytes
.../description/assets/screenshots/33.png | Bin 0 -> 133096 bytes
.../description/assets/screenshots/4.png | Bin 0 -> 34046 bytes
.../description/assets/screenshots/5.png | Bin 0 -> 56786 bytes
.../description/assets/screenshots/6.png | Bin 0 -> 87044 bytes
.../description/assets/screenshots/7.png | Bin 0 -> 79109 bytes
.../description/assets/screenshots/8.png | Bin 0 -> 34605 bytes
.../description/assets/screenshots/9.png | Bin 0 -> 117012 bytes
.../description/assets/screenshots/hero.gif | Bin 0 -> 263659 bytes
.../static/description/banner.jpg | Bin 0 -> 101918 bytes
.../static/description/icon.png | Bin 0 -> 7687 bytes
.../static/description/index.html | 1166 +++++++++++++++++
.../static/src/js/burnup_chart_model.js | 90 ++
.../src/js/burnup_chart_search_model.js | 126 ++
.../static/src/js/burnup_chart_view.js | 20 +
.../static/src/js/composer_patch.js | 35 +
.../static/src/js/velocity_chart_model.js | 27 +
.../src/js/velocity_chart_search_model.js | 87 ++
.../static/src/js/velocity_chart_view.js | 16 +
.../static/src/scss/style.scss | 3 +
.../static/src/xml/burnup_chart_view.xml | 14 +
.../static/src/xml/chatter_templates.xml | 47 +
.../static/src/xml/velocity_chart_view.xml | 14 +
.../static/xls/task_checklist.xlsx | Bin 0 -> 4814 bytes
.../views/ir_attachment_views.xml | 18 +
.../views/project_category_views.xml | 51 +
.../project_checklist_template_views.xml | 53 +
.../views/project_checklist_views.xml | 52 +
.../views/project_issue_views.xml | 112 ++
.../views/project_milestone_views.xml | 79 ++
.../views/project_project_views.xml | 177 +++
.../project_task_checklist_template_views.xml | 52 +
.../views/project_task_checklist_views.xml | 52 +
.../views/project_task_views.xml | 87 ++
.../views/res_config_settings_views.xml | 61 +
.../wizard/__init__.py | 25 +
.../wizard/project_shortcut.py | 67 +
.../wizard/project_shortcut_views.xml | 30 +
.../wizard/project_stage_update.py | 41 +
.../wizard/project_stage_update_views.xml | 36 +
.../wizard/project_task_checklist_import.py | 79 ++
.../project_task_checklist_import_views.xml | 61 +
.../wizard/project_task_mass_update.py | 83 ++
.../wizard/project_task_mass_update_views.xml | 59 +
139 files changed, 4814 insertions(+)
create mode 100755 advanced_project_management_system/README.rst
create mode 100755 advanced_project_management_system/__init__.py
create mode 100755 advanced_project_management_system/__manifest__.py
create mode 100755 advanced_project_management_system/data/ir_actions_server_data.xml
create mode 100755 advanced_project_management_system/data/ir_cron_data.xml
create mode 100755 advanced_project_management_system/data/ir_sequence_data.xml
create mode 100755 advanced_project_management_system/data/mail_template_data.xml
create mode 100755 advanced_project_management_system/doc/RELEASE_NOTES.md
create mode 100755 advanced_project_management_system/models/__init__.py
create mode 100755 advanced_project_management_system/models/ir_attachment.py
create mode 100755 advanced_project_management_system/models/project_category.py
create mode 100755 advanced_project_management_system/models/project_checklist.py
create mode 100755 advanced_project_management_system/models/project_checklist_info.py
create mode 100755 advanced_project_management_system/models/project_checklist_template.py
create mode 100755 advanced_project_management_system/models/project_issue.py
create mode 100755 advanced_project_management_system/models/project_project.py
create mode 100755 advanced_project_management_system/models/project_task.py
create mode 100755 advanced_project_management_system/models/project_task_checklist.py
create mode 100755 advanced_project_management_system/models/project_task_checklist_info.py
create mode 100755 advanced_project_management_system/models/project_task_checklist_template.py
create mode 100644 advanced_project_management_system/models/project_task_type.py
create mode 100755 advanced_project_management_system/models/res_config_settings.py
create mode 100644 advanced_project_management_system/report/__init__.py
create mode 100755 advanced_project_management_system/report/ir_action_report.xml
create mode 100755 advanced_project_management_system/report/project_project_template.xml
create mode 100644 advanced_project_management_system/report/project_task_burnup_chart_report.py
create mode 100644 advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
create mode 100755 advanced_project_management_system/report/project_task_template.xml
create mode 100644 advanced_project_management_system/report/project_task_velocity_chart_report.py
create mode 100644 advanced_project_management_system/report/project_task_velocity_chart_report_views.xml
create mode 100755 advanced_project_management_system/security/advanced_project_management_system_security.xml
create mode 100755 advanced_project_management_system/security/ir.model.access.csv
create mode 100755 advanced_project_management_system/static/csv/task_checklist.csv
create mode 100644 advanced_project_management_system/static/description/assets/icons/capture (1).png
create mode 100644 advanced_project_management_system/static/description/assets/icons/check.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/chevron.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/cogs.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/consultation.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/ecom-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/education-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/hotel-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/img.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/license.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/lifebuoy.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/manufacturing-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/photo-capture.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/pos-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/puzzle.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/restaurant-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/service-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/trading-black.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/training.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/update.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/user.png
create mode 100644 advanced_project_management_system/static/description/assets/icons/wrench.png
create mode 100644 advanced_project_management_system/static/description/assets/misc/Cybrosys R.png
create mode 100644 advanced_project_management_system/static/description/assets/misc/email.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/phone.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/star (1) 2.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/support (1) 1.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/support-email.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/tick-mark.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/whatsapp 1.svg
create mode 100644 advanced_project_management_system/static/description/assets/misc/whatsapp.svg
create mode 100644 advanced_project_management_system/static/description/assets/modules/1.png
create mode 100644 advanced_project_management_system/static/description/assets/modules/2.jpg
create mode 100644 advanced_project_management_system/static/description/assets/modules/3.png
create mode 100644 advanced_project_management_system/static/description/assets/modules/4.jpg
create mode 100644 advanced_project_management_system/static/description/assets/modules/5.png
create mode 100644 advanced_project_management_system/static/description/assets/modules/6.jpg
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/1.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/10.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/11.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/12.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/13.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/14.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/15.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/16.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/17.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/18.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/19.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/2.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/20.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/21.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/22.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/23.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/24.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/25.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/26.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/27.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/28.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/29.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/3.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/30.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/31.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/32.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/33.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/4.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/5.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/6.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/7.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/8.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/9.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/hero.gif
create mode 100644 advanced_project_management_system/static/description/banner.jpg
create mode 100644 advanced_project_management_system/static/description/icon.png
create mode 100755 advanced_project_management_system/static/description/index.html
create mode 100644 advanced_project_management_system/static/src/js/burnup_chart_model.js
create mode 100644 advanced_project_management_system/static/src/js/burnup_chart_search_model.js
create mode 100644 advanced_project_management_system/static/src/js/burnup_chart_view.js
create mode 100644 advanced_project_management_system/static/src/js/composer_patch.js
create mode 100644 advanced_project_management_system/static/src/js/velocity_chart_model.js
create mode 100644 advanced_project_management_system/static/src/js/velocity_chart_search_model.js
create mode 100644 advanced_project_management_system/static/src/js/velocity_chart_view.js
create mode 100644 advanced_project_management_system/static/src/scss/style.scss
create mode 100644 advanced_project_management_system/static/src/xml/burnup_chart_view.xml
create mode 100644 advanced_project_management_system/static/src/xml/chatter_templates.xml
create mode 100644 advanced_project_management_system/static/src/xml/velocity_chart_view.xml
create mode 100755 advanced_project_management_system/static/xls/task_checklist.xlsx
create mode 100755 advanced_project_management_system/views/ir_attachment_views.xml
create mode 100755 advanced_project_management_system/views/project_category_views.xml
create mode 100755 advanced_project_management_system/views/project_checklist_template_views.xml
create mode 100755 advanced_project_management_system/views/project_checklist_views.xml
create mode 100755 advanced_project_management_system/views/project_issue_views.xml
create mode 100755 advanced_project_management_system/views/project_milestone_views.xml
create mode 100755 advanced_project_management_system/views/project_project_views.xml
create mode 100755 advanced_project_management_system/views/project_task_checklist_template_views.xml
create mode 100755 advanced_project_management_system/views/project_task_checklist_views.xml
create mode 100755 advanced_project_management_system/views/project_task_views.xml
create mode 100755 advanced_project_management_system/views/res_config_settings_views.xml
create mode 100755 advanced_project_management_system/wizard/__init__.py
create mode 100644 advanced_project_management_system/wizard/project_shortcut.py
create mode 100644 advanced_project_management_system/wizard/project_shortcut_views.xml
create mode 100755 advanced_project_management_system/wizard/project_stage_update.py
create mode 100755 advanced_project_management_system/wizard/project_stage_update_views.xml
create mode 100755 advanced_project_management_system/wizard/project_task_checklist_import.py
create mode 100755 advanced_project_management_system/wizard/project_task_checklist_import_views.xml
create mode 100755 advanced_project_management_system/wizard/project_task_mass_update.py
create mode 100755 advanced_project_management_system/wizard/project_task_mass_update_views.xml
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
+
+
+
+ Project |
+ Task |
+ Deadline 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Project Manager:
+
+
+
Customer:
+
+
+
+
+
+ Task Name |
+ Allocated Hours |
+ Spend Hours |
+ Remaining Hours |
+ Assigned To |
+ Assign Date |
+ Deadline |
+ Stage |
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+
diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report.py b/advanced_project_management_system/report/project_task_burnup_chart_report.py
new file mode 100644
index 000000000..4dd677fb4
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from collections import defaultdict
+from odoo import fields, models, _
+
+
+class ProjectTaskBurnupChartReport(models.AbstractModel):
+ """This model defines the Burnup Chart report for project tasks. """
+ _name = 'project.task.burnup.chart.report'
+ _description = 'Burnup Chart'
+ _auto = True
+
+ project_id = fields.Many2one('project.project', readonly=True)
+ date = fields.Datetime(string='Date', readonly=True,
+ help='The date of data entry')
+ completed_count = fields.Integer(string='Completed Tasks', readonly=True,
+ help='The number of completed tasks')
+ total_count = fields.Integer(string='Total Tasks', readonly=True,
+ help='The total number of tasks')
+
+ def _read_group(self, domain, groupby=(), aggregates=(), having=(),
+ offset=0, limit=None, order=None):
+ data = []
+ project_id = self._context.get('active_id')
+
+ if groupby:
+ tasks = self.env['project.task'].search([
+ ('project_id', '=', project_id),
+ ('stage_id.name', '=', 'Done')
+ ])
+
+ task_counts = defaultdict(lambda: defaultdict(int))
+ task_names = defaultdict(list)
+
+ for task in tasks:
+ completion_date = task.date_deadline or task.create_date.date()
+
+ if isinstance(completion_date, fields.date):
+ completion_date = fields.datetime.combine(completion_date,
+ fields.datetime.min.time())
+ start_date = task.create_date.date()
+
+ if task.stage_id.name == 'Done':
+ month_year = completion_date
+ task_counts[month_year]['Total'] += 1
+
+ if start_date != completion_date:
+ task_counts[month_year]['Start'] += 1
+ task_names[month_year].append(task.name)
+
+ for month_year, counts in task_counts.items():
+ data.append((month_year, task_names[month_year], counts['Total']))
+ return data
diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
new file mode 100644
index 000000000..860051f29
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ project.task.burnup.chart.report.view.search
+ project.task.burnup.chart.report
+
+
+
+
+
+
+
+
+ project.task.burnup.chart.report.view.graph
+ project.task.burnup.chart.report
+
+
+
+
+
+
+
+
+
+ burnup Chart
+ project.task.burnup.chart.report
+ graph
+
+ {'search_default_project_id': active_id, 'search_default_date': 1, 'search_default_stage': 1, 'search_default_filter_date': 1}
+ [('project_id', '!=', False)]
+
+
+ No data yet!
+
+ Analyze how quickly your team is completing your project's tasks and check if everything is progressing according to plan.
+
+
+
\ No newline at end of file
diff --git a/advanced_project_management_system/report/project_task_template.xml b/advanced_project_management_system/report/project_task_template.xml
new file mode 100755
index 000000000..20597f901
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_template.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Project Name:
+
+
+
+
Customer Name:
+
+
+
+
Customer Email:
+
+
+
+
Responsible User:
+
+
+
+
Assign To:
+
+
+
+
Assign Date:
+
+
+
+
Deadline Date:
+
+
+
+
+ Description
+
+
+
+
+
+
+
+
+
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 0000000000000000000000000000000000000000..8824deafca0ae1d56fce83c80cc8ae543855dc68
GIT binary patch
literal 36623
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%0Au
z%R=EpfO{dHkP?j#k>1;E?4mg62PU6{5y_9<(3hwZ4v4dMjX!&+vWi7JuTNKBa~@5td