From b6746a9395907e12a85d0572bfec373ee92eef01 Mon Sep 17 00:00:00 2001
From: AjmalCybro
Date: Fri, 22 Mar 2024 14:56:02 +0530
Subject: [PATCH] Mar 22 [ADD] : Initial Commit
'advanced_project_management_system'
---
advanced_project_management_system/README.rst | 47 +
.../__init__.py | 24 +
.../__manifest__.py | 81 ++
.../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 | 58 ++
.../models/project_checklist_template.py | 33 +
.../models/project_issue.py | 67 ++
.../models/project_project.py | 219 +++++
.../models/project_task.py | 122 +++
.../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 | 67 ++
.../report/__init__.py | 23 +
.../report/ir_action_report.xml | 28 +
.../report/project_project_template.xml | 125 +++
.../project_task_burnup_chart_report.py | 68 ++
...project_task_burnup_chart_report_views.xml | 48 +
.../report/project_task_template.xml | 112 +++
.../project_task_velocity_chart_report.py | 78 ++
...oject_task_velocity_chart_report_views.xml | 50 +
.../security/ir.model.access.csv | 15 +
.../security/ir_attachment_security.xml | 12 +
.../static/csv/task_checklist.csv | 5 +
.../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
.../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
.../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/categories.png | Bin 0 -> 1532 bytes
.../description/assets/misc/check-box.png | Bin 0 -> 1118 bytes
.../description/assets/misc/compass.png | Bin 0 -> 1931 bytes
.../description/assets/misc/corporate.png | Bin 0 -> 1177 bytes
.../assets/misc/customer-support.png | Bin 0 -> 2136 bytes
.../description/assets/misc/cybrosys-logo.png | Bin 0 -> 4496 bytes
.../description/assets/misc/features.png | Bin 0 -> 589 bytes
.../static/description/assets/misc/logo.png | Bin 0 -> 3452 bytes
.../description/assets/misc/pictures.png | Bin 0 -> 1692 bytes
.../description/assets/misc/pie-chart.png | Bin 0 -> 2338 bytes
.../description/assets/misc/right-arrow.png | Bin 0 -> 967 bytes
.../static/description/assets/misc/star.png | Bin 0 -> 1642 bytes
.../description/assets/misc/support.png | Bin 0 -> 3892 bytes
.../description/assets/misc/whatsapp.png | Bin 0 -> 5097 bytes
.../static/description/assets/modules/1.png | Bin 0 -> 86274 bytes
.../static/description/assets/modules/2.png | Bin 0 -> 82475 bytes
.../static/description/assets/modules/3.png | Bin 0 -> 46357 bytes
.../static/description/assets/modules/4.jpg | Bin 0 -> 93003 bytes
.../static/description/assets/modules/5.png | Bin 0 -> 92474 bytes
.../static/description/assets/modules/6.png | Bin 0 -> 87276 bytes
.../description/assets/screenshots/hero.gif | Bin 0 -> 657015 bytes
.../screenshots/project_management_01.png | Bin 0 -> 121081 bytes
.../screenshots/project_management_02.png | Bin 0 -> 75124 bytes
.../screenshots/project_management_03.png | Bin 0 -> 81024 bytes
.../screenshots/project_management_04.png | Bin 0 -> 84035 bytes
.../screenshots/project_management_05.png | Bin 0 -> 106022 bytes
.../screenshots/project_management_06.png | Bin 0 -> 117876 bytes
.../screenshots/project_management_07.png | Bin 0 -> 78513 bytes
.../screenshots/project_management_08.png | Bin 0 -> 162953 bytes
.../screenshots/project_management_09.png | Bin 0 -> 120335 bytes
.../screenshots/project_management_10.png | Bin 0 -> 76010 bytes
.../screenshots/project_management_11.png | Bin 0 -> 150531 bytes
.../screenshots/project_management_12.png | Bin 0 -> 230955 bytes
.../screenshots/project_management_13.png | Bin 0 -> 215898 bytes
.../screenshots/project_management_14.png | Bin 0 -> 119359 bytes
.../screenshots/project_management_15.png | Bin 0 -> 83321 bytes
.../screenshots/project_management_16.png | Bin 0 -> 157319 bytes
.../screenshots/project_management_17.png | Bin 0 -> 119474 bytes
.../screenshots/project_management_18.png | Bin 0 -> 81432 bytes
.../screenshots/project_management_19.png | Bin 0 -> 82592 bytes
.../screenshots/project_management_20.png | Bin 0 -> 153442 bytes
.../screenshots/project_management_21.png | Bin 0 -> 137316 bytes
.../screenshots/project_management_22.png | Bin 0 -> 80451 bytes
.../screenshots/project_management_23.png | Bin 0 -> 119040 bytes
.../screenshots/project_management_24.png | Bin 0 -> 90068 bytes
.../screenshots/project_management_25.png | Bin 0 -> 124831 bytes
.../screenshots/project_management_26.png | Bin 0 -> 87731 bytes
.../screenshots/project_management_27.png | Bin 0 -> 202792 bytes
.../screenshots/project_management_28.png | Bin 0 -> 201936 bytes
.../screenshots/project_management_29.png | Bin 0 -> 124679 bytes
.../screenshots/project_management_30.png | Bin 0 -> 86637 bytes
.../screenshots/project_management_31.png | Bin 0 -> 47723 bytes
.../screenshots/project_management_32.png | Bin 0 -> 83033 bytes
.../screenshots/project_management_33.png | Bin 0 -> 67942 bytes
.../screenshots/project_management_34.png | Bin 0 -> 84159 bytes
.../screenshots/project_management_35.png | Bin 0 -> 65234 bytes
.../screenshots/project_management_36.png | Bin 0 -> 113988 bytes
.../screenshots/project_management_37.png | Bin 0 -> 83168 bytes
.../screenshots/project_management_38.png | Bin 0 -> 116509 bytes
.../screenshots/project_management_39.png | Bin 0 -> 119409 bytes
.../screenshots/project_management_40.png | Bin 0 -> 119952 bytes
.../static/description/banner.jpg | Bin 0 -> 110952 bytes
.../static/description/icon.png | Bin 0 -> 20517 bytes
.../static/description/index.html | 923 ++++++++++++++++++
.../static/src/js/burnup_chart_model.js | 25 +
.../src/js/burnup_chart_search_model.js | 124 +++
.../static/src/js/burnup_chart_view.js | 17 +
.../static/src/js/chatter_time.js | 29 +
.../static/src/js/chatter_topbar.js | 48 +
.../static/src/js/velocity_chart_model.js | 25 +
.../src/js/velocity_chart_search_model.js | 85 ++
.../static/src/js/velocity_chart_view.js | 16 +
.../static/src/xml/burnup_chart_view.xml | 14 +
.../src/xml/chatter_topbar_templates.xml | 18 +
.../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 | 113 +++
.../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 ++
148 files changed, 4468 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/ir.model.access.csv
create mode 100755 advanced_project_management_system/security/ir_attachment_security.xml
create mode 100755 advanced_project_management_system/static/csv/task_checklist.csv
create mode 100755 advanced_project_management_system/static/description/assets/icons/check.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/chevron.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/cogs.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/consultation.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/ecom-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/education-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/hotel-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/license.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/lifebuoy.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/manufacturing-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/pos-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/puzzle.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/restaurant-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/service-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/trading-black.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/training.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/update.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/user.png
create mode 100755 advanced_project_management_system/static/description/assets/icons/wrench.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/categories.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/check-box.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/compass.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/corporate.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/customer-support.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/cybrosys-logo.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/features.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/logo.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/pictures.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/pie-chart.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/right-arrow.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/star.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/support.png
create mode 100755 advanced_project_management_system/static/description/assets/misc/whatsapp.png
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.png
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.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/hero.gif
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_01.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_02.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_03.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_04.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_05.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_06.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_07.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_08.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_09.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_10.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_11.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_12.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_13.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_14.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_15.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_16.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_17.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_18.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_19.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_20.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_21.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_22.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_23.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_24.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_25.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_26.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_27.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_28.png
create mode 100755 advanced_project_management_system/static/description/assets/screenshots/project_management_29.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_30.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_31.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_32.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_33.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_34.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_35.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_36.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_37.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_38.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_39.png
create mode 100644 advanced_project_management_system/static/description/assets/screenshots/project_management_40.png
create mode 100755 advanced_project_management_system/static/description/banner.jpg
create mode 100755 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/chatter_time.js
create mode 100644 advanced_project_management_system/static/src/js/chatter_topbar.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/xml/burnup_chart_view.xml
create mode 100644 advanced_project_management_system/static/src/xml/chatter_topbar_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..4510d6b90
--- /dev/null
+++ b/advanced_project_management_system/README.rst
@@ -0,0 +1,47 @@
+ .. 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, 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..13a89daf3
--- /dev/null
+++ b/advanced_project_management_system/__manifest__.py
@@ -0,0 +1,81 @@
+# -*- 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": "16.0.1.0.0",
+ "category": "Project",
+ "summary": "Advanced Project Management System for Odoo16",
+ "description": "AAdvanced Project Management System",
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'website': "https://www.cybrosys.com",
+ 'depends': ['project', 'hr_timesheet'],
+ 'data': [
+ 'security/ir_attachment_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/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_topbar_templates.xml',
+ '/advanced_project_management_system/static/src/js/chatter_topbar.js',
+ '/advanced_project_management_system/static/src/js/chatter_time.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..30587ebea
--- /dev/null
+++ b/advanced_project_management_system/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 14.03.2024
+#### Version 16.0.1.0.0
+#### ADD
+- Initial commit for Advanced project management system
diff --git a/advanced_project_management_system/models/__init__.py b/advanced_project_management_system/models/__init__.py
new file mode 100755
index 000000000..822cadea3
--- /dev/null
+++ b/advanced_project_management_system/models/__init__.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import ir_attachment
+from . import project_project
+from . import project_category
+from . import project_checklist
+from . import project_checklist_info
+from . import project_checklist_template
+from . import project_issue
+from . import project_task
+from . import project_task_checklist
+from . import project_task_checklist_info
+from . import project_task_checklist_template
+from . import project_task_type
+from . import res_config_settings
diff --git a/advanced_project_management_system/models/ir_attachment.py b/advanced_project_management_system/models/ir_attachment.py
new file mode 100755
index 000000000..9d07710ea
--- /dev/null
+++ b/advanced_project_management_system/models/ir_attachment.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class IrAttachment(models.Model):
+ """ Added document expiry information"""
+ _inherit = 'ir.attachment'
+
+ expiry_date = fields.Date(string='Expiry Date',
+ help="for setting expiry date for the document")
+ expiry_notification = fields.Boolean(string='Expiry Date Notification',
+ help="For sending expiry notification")
+ partner_id = fields.Many2one('res.partner', string="partner",
+ help="For adding the partner ")
+ document_email_to = fields.Char(
+ default=lambda self: self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.email'), string="Email to",
+ help="For getting owner email")
+ document_mai_customer = fields.Boolean(
+ default=lambda self: self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.notify_customer'), string="Email to customer",
+ help="Notify email to customer ")
+
+ def document_expire_notification(self):
+ """ Automatically sent email when the
+ document expiration date is over"""
+ if self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.notify_customer'):
+ attachments = self.search([('expiry_date', '!=', None)])
+ for attachment in attachments:
+ if attachment.expiry_date < fields.Date.today():
+ mail_template = attachment.env.ref(
+ 'advanced_project_management_system.document_expire_notification_to_customer')
+ mail_template.send_mail(attachment.id, force_send=True)
+ attachments = self.search([('expiry_date', '!=', None)])
+ for attachment in attachments:
+ if attachment.expiry_notification:
+ if attachment.expiry_date < fields.Date.today():
+ mail_template = attachment.env.ref(
+ 'advanced_project_management_system.document_expire_notification_mail_template')
+ mail_template.send_mail(attachment.id, force_send=True)
+
+ @api.onchange('res_id')
+ def _onchange_res_id(self):
+ """ Compute customer name and add to attachment from projects"""
+ attachments = self.search([('res_model', '=', 'project.project')])
+ for attachment in attachments:
+ projects = self.env['project.project'].search(
+ [('id', '=', attachment.res_id)])
+ if projects.partner_id:
+ attachment.partner_id = projects.partner_id.id
diff --git a/advanced_project_management_system/models/project_category.py b/advanced_project_management_system/models/project_category.py
new file mode 100755
index 000000000..bb27729cc
--- /dev/null
+++ b/advanced_project_management_system/models/project_category.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectCategory(models.Model):
+ """ Setting up the project category"""
+ _name = "project.category"
+ _description = "Project categories"
+
+ name = fields.Char(string='Project Category', tracking=True,
+ help="Name of the category")
+ is_active = fields.Boolean(string='Active',
+ help="Check is it active or not ")
diff --git a/advanced_project_management_system/models/project_checklist.py b/advanced_project_management_system/models/project_checklist.py
new file mode 100755
index 000000000..400c33ed7
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklist(models.Model):
+ """ Project checklist information"""
+ _name = "project.checklist"
+ _description = "Project checklist"
+
+ name = fields.Char(string='Name', required=True,
+ name="name of the checklist")
+ description = fields.Char(string='Description', required=True,
+ help="Description about the checklist ")
+ company_id = fields.Many2one('res.company', string='Company',
+ required=True, help="Company information",
+ default=lambda self: self.env.company.id)
diff --git a/advanced_project_management_system/models/project_checklist_info.py b/advanced_project_management_system/models/project_checklist_info.py
new file mode 100755
index 000000000..a4140851d
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist_info.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklistInfo(models.Model):
+ """ Project checklist details"""
+ _name = "project.checklist.info"
+ _description = "Project checklist information"
+
+ checklist_id = fields.Many2one('project.checklist',
+ string='Name',
+ help="Project checklist details")
+ description = fields.Char(string='Description',
+ related='checklist_id.description',
+ help="description about the checklist")
+ project_id = fields.Many2one('project.project', string="Project",
+ help="details of the project")
+ date = fields.Date(string='Date', default=fields.Date.today(),
+ help="get the date ")
+ state = fields.Selection(
+ selection=[('new', 'New'), ('progres', 'In Progress'),
+ ('done', 'Done'), ('cancel', 'Cancel')], default='new',
+ readonly=False, string="Status",
+ help="Get information about the state")
+
+ def action_set_checklist_complete(self):
+ """ Mark the checklist progress and completion"""
+ if self.state in ['new', 'progres']:
+ self.state = 'done'
+ checklist_template_id = self.env[
+ 'project.checklist.template'].search(
+ [('id', 'in', self.project_id.checklist_template_ids.ids)])
+ self.project_id.checklist_progress += 100 / float(
+ len(checklist_template_id.checklist_ids.ids))
+
+ def action_set_checklist_close(self):
+ """ Checklist cancel details"""
+ self.state = 'cancel'
diff --git a/advanced_project_management_system/models/project_checklist_template.py b/advanced_project_management_system/models/project_checklist_template.py
new file mode 100755
index 000000000..041436ce5
--- /dev/null
+++ b/advanced_project_management_system/models/project_checklist_template.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklistTemplate(models.Model):
+ """ Project checklist template"""
+ _name = "project.checklist.template"
+ _description = "Project checklist template"
+
+ name = fields.Char(string='Name', help="name of the template")
+ checklist_ids = fields.Many2many('project.checklist',
+ string='Checklist',
+ help="checklist information")
diff --git a/advanced_project_management_system/models/project_issue.py b/advanced_project_management_system/models/project_issue.py
new file mode 100755
index 000000000..effca06c7
--- /dev/null
+++ b/advanced_project_management_system/models/project_issue.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class ProjectIssue(models.Model):
+ """ For managing project issues"""
+ _name = "project.issue"
+ _description = 'Project and task issue'
+
+ user_id = fields.Many2one("res.users", string="Assigned to",
+ help="The person who is responsible to solve "
+ "the issue")
+ summary = fields.Text(string='Issue summary', help="Adding project issue")
+ email = fields.Char(string="Email", help="Email address")
+ project_id = fields.Many2one('project.project', string="project",
+ help="To know issue noticed in which project")
+ task_id = fields.Many2one('project.task', string="Task",
+ help="To know issue noticed in which task",
+ domain=[('project_id', '=', project_id)])
+ priority = fields.Selection([('0', 'Low'), ('1', 'High')], default='0',
+ string="Priority")
+ tag_ids = fields.Many2many('project.tags', string='Tags',
+ help='Set the tags')
+ partner_id = fields.Many2one('res.partner', string="Contact",
+ help="Know about the contact details")
+ name = fields.Char(string='Number', default='new',
+ help='To track the issue reference')
+ description = fields.Text(string='Description',
+ help="To add the issue in detail")
+ extra_info = fields.Text(string="Extra Info",
+ help="To add some extra information")
+ state = fields.Selection([('new', 'New'), ('progress', 'In Progress'),
+ ('done', 'Done'), ('cancel', 'Cancel')],
+ default='new', string='State',
+ help='Project issue pipeline stages')
+ create_date = fields.Datetime(string="Create Date",
+ help='For tracking the record creation date',
+ default=fields.Datetime.now())
+
+ @api.model
+ def create(self, vals):
+ """ Added reference number"""
+ if vals.get('name', 'New'):
+ vals['name'] = self.env['ir.sequence'].next_by_code(
+ 'project.issue')
+ res = super(ProjectIssue, self).create(vals)
+ return res
diff --git a/advanced_project_management_system/models/project_project.py b/advanced_project_management_system/models/project_project.py
new file mode 100755
index 000000000..8b3e120b5
--- /dev/null
+++ b/advanced_project_management_system/models/project_project.py
@@ -0,0 +1,219 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+import json
+from odoo import api, fields, models, _
+
+
+class ProjectProject(models.Model):
+ """ Added project documents,checklist,stage updates"""
+ _inherit = 'project.project'
+
+ project_category_id = fields.Many2one('project.category',
+ string='Project Category',
+ help="For adding project category ")
+ document_count = fields.Integer(string='Documents',
+ compute='_compute_document_count',
+ help="For getting the document count")
+ project_stage_id = fields.Many2one('project.project.stage',
+ tracking=True, string='Stage',
+ help="Project stages")
+ project_checklist_info_ids = fields.One2many('project.checklist.info',
+ 'project_id',
+ help="Project checklist details",
+ string='Checklist')
+ checklist_progress = fields.Integer(string="Progress",
+ help="For checklist progress bar ")
+ checklist_template_ids = fields.Many2many('project.checklist.template',
+ string='checklist template',
+ help="For getting checklist "
+ "template")
+ issue_count = fields.Integer(string="Project issue",
+ help="For getting project issue ",
+ compute="_compute_issue_count")
+ shortcut_ids = fields.One2many('project.shortcut', 'project_id',
+ string='Shortcuts')
+ url_shortcut = fields.Char(string="URL Shortcut",
+ compute="_compute_url_shortcut",
+ help="Enter the URL shortcut.")
+ is_active = fields.Boolean(string="Is Active", store=True,
+ help="Check this box if the URL is active.")
+ url_link = fields.Char(string="URL Link", help="Enter the URL link.")
+ url_name = fields.Char(string="URL Name",
+ help="Enter the name associated with the URL.")
+
+ def open_project_creation_wizard(self):
+ """ Open the project creation wizard """
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'project.project',
+ 'view_mode': 'form',
+ 'view_id': self.env.ref(
+ 'advanced_project_management_system.project.project.view.form.'
+ 'simplified').id,
+ 'target': 'current',
+ }
+
+ @api.depends('url_link', 'url_name')
+ def _compute_url_shortcut(self):
+ """ Compute the URL shortcut and its activation status """
+ for project in self:
+ if project.url_link:
+ project.is_active = True
+ project.url_shortcut = project.url_link
+ else:
+ project.url_shortcut = "Add Link"
+ project.is_active = False
+
+ def open_url_shortcut(self):
+ """ Open the URL shortcut """
+ for project in self:
+ if project.url_shortcut:
+ return {
+ 'name': self.url_name,
+ 'type': 'ir.actions.act_url',
+ 'url': project.url_shortcut,
+ 'target': 'self',
+ }
+
+ def button_document(self):
+ """ Return document kanban for the project"""
+ return {
+ 'name': 'Documents',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'ir.attachment',
+ 'view_mode': 'kanban,form',
+ 'res_id': self._origin.id,
+ 'domain': [
+ ('res_id', '=', self._origin.id),
+ ('res_model', '=', 'project.project')
+ ],
+ }
+
+ def _compute_document_count(self):
+ """ Compute document count and return """
+ for rec in self:
+ attachment_ids = self.env['ir.attachment'].search(
+ [('res_model', '=', 'project.project'),
+ ('res_id', '=', rec.id)])
+ rec.document_count = len(attachment_ids)
+
+ def project_multi_stage_update(self):
+ """ Return wizard to update the project stage"""
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Mass Update',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'res_model': 'project.stage.update',
+ }
+
+ @api.onchange('checklist_template_ids')
+ def _onchange_checklist_template_ids(self):
+ """ Updating checklist"""
+ check_list_id = self.env['project.checklist.template'].browse(
+ self.checklist_template_ids.ids)
+ if check_list_id:
+ for checklist_id in check_list_id.checklist_ids.ids:
+ self.update({
+ 'project_checklist_info_ids':
+ [(0, 0, {
+ 'checklist_id': checklist_id
+ })]
+ })
+
+ def _compute_issue_count(self):
+ """ For getting project issue count"""
+ for rec in self:
+ issue_id = self.env['project.issue'].search(
+ [('project_id', '=', rec.id)])
+ rec.issue_count = len(issue_id)
+
+ def button_issue(self):
+ """Return project issues"""
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Project Issues',
+ 'view_mode': 'tree,form',
+ 'res_model': 'project.issue',
+ 'domain': [('project_id', '=', self.id)]
+ }
+
+ def _get_stat_buttons(self):
+ """ Get statistical buttons for the project """
+ self.ensure_one()
+ buttons = super(ProjectProject, self)._get_stat_buttons()
+ if self.user_has_groups('project.group_project_user'):
+ buttons.append({
+ 'icon': 'area-chart',
+ 'text': _('Burnup Chart'),
+ 'action_type': 'action',
+ 'action': 'advanced_project_management_system.action_project_task_burnup_chart_report',
+ 'additional_context': json.dumps({
+ 'active_id': self.id,
+ }),
+ 'show': True,
+ 'sequence': 60,
+ })
+ if self.user_has_groups('project.group_project_user'):
+ buttons.append({
+ 'icon': 'line-chart',
+ 'text': _('Velocity Chart'),
+ 'action_type': 'action',
+ 'action': 'advanced_project_management_system.action_project_velocity_chart_report',
+ 'additional_context': json.dumps({
+ 'active_id': self.id,
+ }),
+ 'show': True,
+ 'sequence': 60,
+ })
+ return buttons
+
+ def action_project_task_burnup_chart_report(self):
+ """ Open the Burnup Chart report for the project """
+ action = self.env['ir.actions.act_window']._for_xml_id(
+ 'advanced_project_management_system'
+ '.action_project_task_burnup_chart_report')
+ action['display_name'] = _("%(name)s's Burnup Chart", name=self.name)
+ return action
+
+ def action_project_velocity_chart_report(self):
+ """ Open the Velocity Chart report for the project """
+ action = self.env['ir.actions.act_window']._for_xml_id(
+ 'advanced_project_management_system'
+ '.action_project_velocity_chart_report')
+ action['display_name'] = _("%(name)s's Velocity Chart",
+ name=self.name)
+ return action
+
+ def action_open_shortcut(self):
+ """ Open the shortcut creation form """
+ view_id = self.env.ref(
+ 'advanced_project_management_system.project_shortcut_view_form').id
+ return {
+ 'name': 'Add Custom Project Shortcut',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'project.shortcut',
+ 'views': [(view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ }
diff --git a/advanced_project_management_system/models/project_task.py b/advanced_project_management_system/models/project_task.py
new file mode 100755
index 000000000..acd0b2905
--- /dev/null
+++ b/advanced_project_management_system/models/project_task.py
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+from datetime import datetime
+
+
+class ProjectTask(models.Model):
+ """ Added checklist and document details"""
+ _inherit = 'project.task'
+
+ document_count = fields.Integer(string='Documents',
+ compute='_compute_document_count',
+ help="For getting document count")
+ checklist_template_ids = fields.Many2many(
+ 'project.task.checklist.template',
+ string='Checklist', help="For adding project checklist template")
+ checklist_info_ids = fields.One2many('project.task.checklist.info',
+ 'task_id', string="checklist info",
+ help="for getting project checklist "
+ "details")
+ checklist_progress = fields.Float(string='Checklist Completed',
+ colors="red,orange,yellow,green",
+ help="For tracking checklist progress",
+ max_value=1, min_value=0)
+ task_type = fields.Selection([
+ ('task', 'Task'),
+ ('subtask', 'Subtask'),
+ ('bug', 'Bug'),
+ ], string='Task Type', default="task")
+
+ def task_overdue_notification(self):
+ """ Scheduled action for email notification to
+ employee about task due """
+ if self.env['ir.config_parameter'].sudo().get_param(
+ 'res.config.settings.is_overdue_notification'):
+ task_ids = self.search([])
+ for task in task_ids:
+ if task.stage_id.name not in (
+ 'Done',
+ 'Canceled') and task.date_deadline and task.date_deadline < fields.Date.today():
+ mail_template = task.env.ref(
+ 'advanced_project_management_system.task_due_email_notification')
+ mail_template.send_mail(task.id, force_send=True)
+
+ def _get_user_emails(self):
+ """ Return email ids of the employee"""
+ emails = []
+ task_ids = self.search([('date_deadline', '<', fields.Date.today())])
+ for task in task_ids:
+ if task.stage_id.name not in ('Done', 'Canceled'):
+ for user in task.user_ids:
+ emails.append(user.login)
+ return emails
+
+ def _compute_document_count(self):
+ """ Compute document count and return """
+ for rec in self:
+ attachment_ids = self.env['ir.attachment'].search(
+ [('res_model', '=', 'project.task'), ('res_id', '=', rec.id)])
+ rec.document_count = len(attachment_ids)
+
+ def button_task_document(self):
+ """ Return document kanban for the task"""
+ return {
+ 'name': 'Documents',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'ir.attachment',
+ 'view_mode': 'kanban,form',
+ 'res_id': self._origin.id,
+ 'domain': [
+ ('res_id', '=', self._origin.id),
+ ('res_model', '=', 'project.task')],
+ }
+
+ def task_mass_update(self):
+ """ Return wizard for updating task details"""
+ return {
+ 'name': 'Documents',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'project.task.mass.update',
+ 'target': 'new',
+ 'view_mode': 'form',
+ }
+
+ @api.onchange('stage_id')
+ def _onchange_stage_id(self):
+ """ While changing task stage task will automatically assign to
+ users from task stage"""
+ if self.stage_id.user_ids:
+ self.user_ids = self.stage_id.user_ids
+
+ @api.onchange('checklist_template_ids')
+ def _onchange_checklist_template_ids(self):
+ check_list_id = self.env['project.task.checklist.template'].browse(
+ self.checklist_template_ids.ids)
+ if check_list_id:
+ for checklist_id in check_list_id.checklist_ids.ids:
+ self.update({
+ 'checklist_info_ids':
+ [(0, 0, {
+ 'checklist_id': checklist_id
+ })]
+ })
diff --git a/advanced_project_management_system/models/project_task_checklist.py b/advanced_project_management_system/models/project_task_checklist.py
new file mode 100755
index 000000000..f688d8528
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_checklist.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectChecklist(models.Model):
+ """Task checklist details"""
+ _name = "project.task.checklist"
+ _description = "Task Custom Checklist"
+
+ name = fields.Char(string='Name', required=True,
+ help="name of the checklist")
+ description = fields.Char(string='Description', required=True,
+ help="Description of the checklist")
+ company_id = fields.Many2one('res.company', string='Company',
+ required=True,
+ default=lambda self: self.env.company.id,
+ help="For getting company details")
diff --git a/advanced_project_management_system/models/project_task_checklist_info.py b/advanced_project_management_system/models/project_task_checklist_info.py
new file mode 100755
index 000000000..f801bb325
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_checklist_info.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models, _
+from odoo.exceptions import ValidationError
+
+
+class ProjectTaskChecklistInfo(models.Model):
+ """ Task checklist details"""
+ _name = "project.task.checklist.info"
+ _description = "Task checklist information"
+
+ checklist_id = fields.Many2one('project.task.checklist',
+ string='Name', help="checklist")
+ description = fields.Char(string='Description',
+ related='checklist_id.description',
+ help="Description of the checklist info ")
+ task_id = fields.Many2one('project.task', string="Task",
+ help="Task details")
+ checklist_progress = fields.Integer(string="progress",
+ help="For tracking the checklist "
+ "progress and completion")
+ date = fields.Date(string='Date', default=fields.Date.today(),
+ help="Get the date information")
+ state = fields.Selection(
+ selection=[('new', 'New'), ('progres', 'In Progress'),
+ ('done', 'Done'), ('cancel', 'Cancel')], default='new',
+ string="Status", help="get the status of the checklist ")
+
+ def action_set_checklist_complete(self):
+ """ Managing the checklist progress and completion"""
+ if self.state in ['new', 'progres']:
+ checklist_template_id = self.env[
+ 'project.task.checklist.template'].search(
+ [('id', 'in', self.task_id.checklist_template_ids.ids)])
+ if len(checklist_template_id.checklist_ids.ids) > 0:
+ self.task_id.checklist_progress += 100 / float(
+ len(checklist_template_id.checklist_ids.ids))
+ self.state = 'done'
+ else:
+ raise ValidationError(_("Please add checklist"))
+
+ def action_set_checklist_close(self):
+ """ Checklist cancel info """
+ self.state = 'cancel'
diff --git a/advanced_project_management_system/models/project_task_checklist_template.py b/advanced_project_management_system/models/project_task_checklist_template.py
new file mode 100755
index 000000000..fa8cf5760
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_checklist_template.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectTaskChecklistTemplate(models.Model):
+ """Task checklist template"""
+ _name = "project.task.checklist.template"
+ _description = "Task checklist template"
+
+ name = fields.Char(string='Name', help="name of the template")
+ checklist_ids = fields.Many2many('project.task.checklist',
+ string='Checklist',
+ help="To get the checklist details")
diff --git a/advanced_project_management_system/models/project_task_type.py b/advanced_project_management_system/models/project_task_type.py
new file mode 100644
index 000000000..9628523d9
--- /dev/null
+++ b/advanced_project_management_system/models/project_task_type.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class ProjectTaskType(models.Model):
+ """ Added user information"""
+ _inherit = 'project.task.type'
+
+ user_ids = fields.Many2many('res.users', string='Assign Multiple Users',
+ help="We can assign multiple users ")
diff --git a/advanced_project_management_system/models/res_config_settings.py b/advanced_project_management_system/models/res_config_settings.py
new file mode 100755
index 000000000..f2cdae3c8
--- /dev/null
+++ b/advanced_project_management_system/models/res_config_settings.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2024-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ """ Added document expiry notification expiry mail details """
+ _inherit = "res.config.settings"
+
+ is_project_category = fields.Boolean(
+ string='Enable Project Category',
+ help="Enabling project category",
+ config_parameter='advanced_project_management_system.is_project_category')
+ document_expiry_notification = fields.Boolean(
+ string='Document Expiry Notification',
+ help="For sending document expiry notification",
+ config_parameter='advanced_project_management_system.document_expiry_notification')
+ notify_customer = fields.Boolean(
+ string='Notify Customer',
+ help="For notifying the customer",
+ config_parameter='advanced_project_management_system.notify_customer')
+ on_expiry_notification = fields.Boolean(
+ string='On Expiry Date Notification', help="Sent expiry notification",
+ config_parameter='advanced_project_management_system.on_expiry_notification')
+ email = fields.Char(
+ string='Notify Email to', help="Get email id",
+ config_parameter='advanced_project_management_system.email')
+ notify_days = fields.Integer(
+ string='Notify After Expiry Date',
+ help="Notification sent before these days",
+ config_parameter='advanced_project_management_system.notify_days')
+ is_overdue_notification = fields.Boolean(
+ string='Overdue Notification?',
+ help="For sending overdue notification",
+ config_parameter='advanced_project_management_system.is_overdue_notification')
+ notification_before = fields.Integer(
+ string='Notification Days',
+ help="Sent notification before these days",
+ config_parameter='advanced_project_management_system.notification_before')
+
+ @api.onchange('is_project_category')
+ def _onchange_is_project_category(self):
+ groups = self.env.ref(
+ 'advanced_project_management_system.group_project_category')
+ if self.is_project_category:
+ groups.write({'users': [(4, self.env.user.id)]})
+ else:
+ groups.write({'users': [(3, self.env.user.id)]})
diff --git a/advanced_project_management_system/report/__init__.py b/advanced_project_management_system/report/__init__.py
new file mode 100644
index 000000000..9d9667e29
--- /dev/null
+++ b/advanced_project_management_system/report/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import project_task_burnup_chart_report
+from . import project_task_velocity_chart_report
diff --git a/advanced_project_management_system/report/ir_action_report.xml b/advanced_project_management_system/report/ir_action_report.xml
new file mode 100755
index 000000000..23b3f3153
--- /dev/null
+++ b/advanced_project_management_system/report/ir_action_report.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ Print Project
+ project.project
+ qweb-pdf
+ advanced_project_management_system.project_details_report
+
+ project_report
+ 'Project Details'
+
+
+ report
+
+
+
+ Print Task
+ project.task
+ qweb-pdf
+ advanced_project_management_system.task_details_report
+ task_report
+ 'Task Details'
+
+
+ report
+
+
diff --git a/advanced_project_management_system/report/project_project_template.xml b/advanced_project_management_system/report/project_project_template.xml
new file mode 100755
index 000000000..76dcaef0b
--- /dev/null
+++ b/advanced_project_management_system/report/project_project_template.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Project Manager :
+
+
+
Customer :
+
+
+
+
+ Task Name |
+ Planned Hours |
+ Spend Hours |
+ Remaining Hours |
+ Assigned To |
+ Assign Date |
+ Deadline |
+ Stage |
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+
diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report.py b/advanced_project_management_system/report/project_task_burnup_chart_report.py
new file mode 100644
index 000000000..f98ab37f4
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from collections import defaultdict
+from odoo import api, fields, models, _
+
+
+class ProjectTaskBurnupChartReport(models.AbstractModel):
+ """This model defines the Burnup Chart report for project tasks. """
+ _name = 'project.task.burnup.chart.report'
+ _description = 'Burnup Chart'
+
+ date = fields.Datetime(string='Date', readonly=True,
+ help='The date of data entry')
+ completed_count = fields.Integer(string='Completed Tasks', readonly=True,
+ help='The number of completed tasks')
+ total_count = fields.Integer(string='Total Tasks', readonly=True,
+ help='The total number of tasks')
+ @api.model
+ def _read_group_raw(self, domain, fields, groupby, offset=0,
+ limit=None, orderby=False, lazy=True):
+ """Generate raw data for the Burnup Chart report."""
+ data = []
+ project_id = self._context.get('active_id')
+ if groupby:
+ tasks = self.env['project.task'].search([
+ ('project_id', '=', project_id),
+ ('stage_id.name', '=', 'Done')
+ ])
+ task_counts = defaultdict(lambda: defaultdict(int))
+ task_names = defaultdict(list)
+ for task in tasks:
+ completion_date = task.date_deadline or task.create_date.date()
+ start_date = task.create_date.date()
+ if task.stage_id.name == 'Done':
+ month_year = completion_date.strftime('%B %Y')
+ task_counts[month_year]['Total'] += 1
+ if start_date != completion_date:
+ task_counts[month_year]['Start'] += 1
+ task_names[month_year].append(task.name)
+ for month_year, counts in task_counts.items():
+ data.append({
+ 'date:month': [0, month_year],
+ 'stage_id': True,
+ 'completed_count': "\n".join(task_names[month_year]),
+ '__count': counts['Total'],
+ 'date_start': counts['Start'],
+ '__domain': domain
+ })
+ return data
diff --git a/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
new file mode 100644
index 000000000..825cb764f
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_burnup_chart_report_views.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ project.task.burnup.chart.report.view.search
+ project.task.burnup.chart.report
+
+
+
+
+
+
+
+
+ project.task.burnup.chart.report.view.graph
+ project.task.burnup.chart.report
+
+
+
+
+
+
+
+
+
+ Burnup Chart
+ project.task.burnup.chart.report
+ graph
+
+ {'search_default_project_id': active_id,
+ 'search_default_date': 1, 'search_default_stage': 1}
+
+ [('display_project_id', '!=', False)]
+
+
+ No data yet!
+
+ Analyze the growth of your project's scope and track progress
+ over time with the Burnup Chart.
+
+
+
+
diff --git a/advanced_project_management_system/report/project_task_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..15ef03e8f
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_velocity_chart_report.py
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions()
+#
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
+# (LGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from collections import defaultdict
+from odoo import api, fields, models, _
+
+
+class ProjectVelocityChartReport(models.AbstractModel):
+ """
+ Abstract model for the Velocity Chart report.
+ This model is used to calculate and display the Velocity Chart report
+ for a specific project and task.
+ """
+ _name = 'project.velocity.chart.report'
+ _description = 'Velocity Chart'
+
+ date = fields.Date(string='Sprint Start Date', readonly=True,
+ help="The start date of the sprint.")
+ completed_story_points = fields.Float(string='Completed Story Points',
+ readonly=True,
+ help="The total story points"
+ " completed in the sprint.")
+
+
+
+ @api.model
+ def _read_group_raw(self, domain, fields, groupby, offset=0, limit=None,
+ orderby=False, lazy=True):
+ """Compute grouped data for the Velocity Chart report."""
+ data = []
+ project_id = self._context.get('active_id')
+ if groupby:
+ tasks = self.env['project.task'].search([
+ ('project_id', '=', project_id),
+ ('stage_id.name', '=', 'Done')
+ ])
+ completed_within_deadline_count = defaultdict(
+ lambda: defaultdict(int))
+ completed_names = defaultdict(list)
+ for task in tasks:
+ sprint_start_date = task.create_date.date()
+ completion_date = task.date_deadline or task.create_date.date()
+ if task.stage_id.name == 'Done':
+ month_year = completion_date.strftime('%B %Y')
+ completed_within_deadline_count[month_year]['Total'] += 1
+ if sprint_start_date != completion_date:
+ completed_within_deadline_count[month_year][
+ 'Start'] += 1
+ completed_names[month_year].append(task.name)
+ for month_year, counts in completed_within_deadline_count.items():
+ data.append({
+ 'date:month': [0, month_year],
+ 'stage_id': True,
+ 'completed_count': "\n".join(
+ completed_names[month_year]),
+ '__count': counts['Total'],
+ 'date_start': counts['Start'],
+ '__domain': domain
+ })
+ return data
diff --git a/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml b/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml
new file mode 100644
index 000000000..ccb4dfd94
--- /dev/null
+++ b/advanced_project_management_system/report/project_task_velocity_chart_report_views.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ project.velocity.chart.report.view.search
+ project.velocity.chart.report
+
+
+
+
+
+
+
+
+ project.velocity.chart.report.view.graph
+ project.velocity.chart.report
+
+
+
+
+
+
+
+
+
+ Velocity Chart
+ project.velocity.chart.report
+ graph
+
+ {'search_default_project_id': active_id,
+ 'search_default_date': 1}
+
+ [('project_id', '!=', False)]
+
+
+ No data yet!
+
+ Analyze your project's velocity over time with the Velocity
+ Chart.
+
+
+
+
diff --git a/advanced_project_management_system/security/ir.model.access.csv b/advanced_project_management_system/security/ir.model.access.csv
new file mode 100755
index 000000000..31b313088
--- /dev/null
+++ b/advanced_project_management_system/security/ir.model.access.csv
@@ -0,0 +1,15 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_project_task_checklist,access.project.task.checklist,model_project_task_checklist,base.group_user,1,1,1,1
+access_project_task_checklist_import,access.project.task.checklist.import,model_project_task_checklist_import,base.group_user,1,1,1,1
+access_project_task_checklist_info,access.project.task.checklist.info,model_project_task_checklist_info,base.group_user,1,1,1,1
+access_project_category,access.project.category,model_project_category,base.group_user,1,1,1,1
+access_project_stage_update,access.project.stage.update,model_project_stage_update,base.group_user,1,1,1,1
+access_project_task_mass_update,access.project.task.mass.update,model_project_task_mass_update,base.group_user,1,1,1,1
+access_project_task_checklist_template,access.project.task.checklist.template,model_project_task_checklist_template,base.group_user,1,1,1,1
+access_project_checklist,access.project.checklist,model_project_checklist,base.group_user,1,1,1,1
+access_project_checklist_template,access.project.checklist.template,model_project_checklist_template,base.group_user,1,1,1,1
+access_project_checklist_info,access.project.checklist.info,model_project_checklist_info,base.group_user,1,1,1,1
+access_project_issue,access.project.issue,model_project_issue,base.group_user,1,1,1,1
+access_project_task_burnup_chart_report,access.burnup.chart.report,model_project_task_burnup_chart_report,base.group_user,1,1,1,1
+advanced_project_management_system.access_project_shortcut,access.project.shortcut,advanced_project_management_system.model_project_shortcut,base.group_user,1,1,1,1
+access_project_velocity_chart_report,access.velocity.chart.report,model_project_velocity_chart_report,base.group_user,1,1,1,1
diff --git a/advanced_project_management_system/security/ir_attachment_security.xml b/advanced_project_management_system/security/ir_attachment_security.xml
new file mode 100755
index 000000000..b40672630
--- /dev/null
+++ b/advanced_project_management_system/security/ir_attachment_security.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Access Project Document
+
+
+
+ access project category menu
+
+
+
diff --git a/advanced_project_management_system/static/csv/task_checklist.csv b/advanced_project_management_system/static/csv/task_checklist.csv
new file mode 100755
index 000000000..ec832f66c
--- /dev/null
+++ b/advanced_project_management_system/static/csv/task_checklist.csv
@@ -0,0 +1,5 @@
+Name,Description
+checklist A,checklist A
+checklist B,checklist B
+checklist C,checklist C
+checklist D,checklist D
\ No newline at end of file
diff --git a/advanced_project_management_system/static/description/assets/icons/check.png b/advanced_project_management_system/static/description/assets/icons/check.png
new file mode 100755
index 0000000000000000000000000000000000000000..c8e85f51d612c626d167e4def7bccdbe1d6d17bd
GIT binary patch
literal 3676
zcmcgvdsGuw8jpg4iY%zK;)6~HwPkUVnaO)JDiRS~W01#+Tdm%CgiJ{?ab|#k+GElB
zs)m`Fq^5i_*c#09+YQPFKr}nwM5Uo-TAL;V~rhtuFtx>&0g#C#25Hk&m#sUb-WA~31MBLg4ikrG=iSUHIid9Tb1
z9z?MSXrWNHppa=`3T|)6tVasU1O?OhfLBAPab-$=Aj^bs-a^skcg`{z&c(Sok1Rnf
z5yC>1Y_<@*U9)a?2rbEDiXfxl+}cG;IVE0Blf_9wp~!G!ilE2DR$`Kz#XXhg1%^X-
zXt38Q$b#e)IuIe${frbc@94mx((??I^YI-(m7WmPOQnh&kOeVE5L~UXliA7*Aqh2!
zygrHdutKqvq)a?GfU^Rbv!F1L2n;u3q&9~jDV>4R8gLYj5g8$Gdf5;PM8e91VHO}tH2a0L8XijPj4WT@OfXUAT
zJnhf*@K9tDMU;r4{0y>T@q!c#dc9U3Y|rFt)F2wJDdXk4$u2;9M#3=B({jWE?ZT8AH%
zg#Ynm7{OD-iERSQ3q%07QcjdCs6!Oo2=IDcJmb$VO_7HU?ogqWL}USZT7WtfjpanX
zO$@a45~6_o7yUgq;$EyC{@)i#qZ|N_R=_bJvw}bMOMXYUaeIWvk1PbW5LY2pwz5%~)8GxdCY^PssXRx5eoz
zoO^~fem~r``@rOd6TkZU8il$gE8}Oz-;cgl{mIK`Pdv;QZ%-|s
z|GM{J*isd7WKnONICtpgNp#AiUeQbceyF&&T9d++kK5LH+xFP3BM=)2;)S)A$sTiU6of)b*Y#j{o#0g@7kQ@$&^?Xwd#C)
z*?`OMhxblls7-52Hx9e<G~?b~~OYW?LWQyXXH
zri{BfJ2omM>(N5CCh8@jy!2dILd_cwrrn5}-u1H`e?0w$}WEW5P9XVW2;W}-E(N#mKb@>!_?9;7EcMc
z{$}01S5Kra9GY1>s2abs9zQ>M^!2#Wa|ZgdtCP$7HxD_{=b{ky&9Q_CH6!ldap(T*
zf}8Jcd_*M`3GY@f|5wb3WaRUu4KwLk^ZH)Cx@g9Gqrd$0VaEMIzioWH^;l}xdpp8T
z8}{xXW=4I#;LY(#$DH;dANHu-yZ<(gnNzG17ONUnb$vS3
zb*fD2Tp8xe4);ae*%)~z`kF2F+Q6#SXw|Se#$N^e?zR2i*OIq99+Iy7|H~LN!Mc6)
H^s@f|!zCx=
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/chevron.png b/advanced_project_management_system/static/description/assets/icons/chevron.png
new file mode 100755
index 0000000000000000000000000000000000000000..2089293d6ad94cfc015cc0a8c07bb03efd4a689e
GIT binary patch
literal 310
zcmV-60m=S}P)fLA$g5CzAh99{FF(tp
zz^tD4))$4c^0SZV9_X~njUYum@4i`~v!i=obU%PG(6q`OMK>{HG>r}*tHKc2@w+qg
z7|l>B76qkX(U2E&K_1Nf!JbCtpGzwGSJ~CkU>QcDY&q>lnbwQm<|2>>iH5vL6qJIP
zp;W{K-Snrb@Z2gLMVZAQQ5jU>DXT)0mtk@hpq-Sb{2q6{0V4Z;tNXT3P5=M^07*qo
IM6N<$f_?6Y+W-In
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/cogs.png b/advanced_project_management_system/static/description/assets/icons/cogs.png
new file mode 100755
index 0000000000000000000000000000000000000000..95d0bad62cf22361b148e1d6cefe2ceab605955d
GIT binary patch
literal 1377
zcmV-n1)lneP)lH5n~Zj$eiG;8wLI!*reT1_VfljL=sA}=JrOptsX2RfC&)+l61t|6JPeb$mZ
z6v1wNClWXiLSlOh+mR64U7bjvhva*zJ0HRRaDbgl@(q$*^PYf*$fE&7)c&&!Rfm?&yLyFbQ?2&R6W6v@rWu!;bZU9|_!
z4Je^Q5$r!vH2{)*ok-wK1%Wz7TG;LgvHhtN39JtxLC&_yAzs|bhFaWtFLrukMR}l_
zP~>z0rF26#(W+H@aXx?6lf(f454Uv()R+QrlZafX3t}g5wp6-Blj;u$XaE#h->+xC
z005Fp0GtMpYoBiuo)VG0UP0_GltOix%1(%-bKgbA0o1pB3&6VoRs+}%fFWUi1MmQV
zmjH~{WZwYT7ng4njIz1iD4PuYIM&NvU6NVO4kNuj`IZ(nzL#XTM^~@uFGT>-aT6dh
zAgaP68%9MDu}+cu7uohT0RHqW9d8lhD-kJqd^i9;Rw)OT!X*D$Y?MvID9;=%I@23T
z$~m4}V3f^0BG}d<_%@?#emG&81LI_NvTQ!T$gzGzil=|K?VCM%e*mZ`d`!0R--N(>
zX_T!|fX{f;z6ZDfz>JL{bFu7UqLI0BExN7c!HmOYg;$V?QB4==-_|4!R<1p=W!b
zXM0?cbrc+q5buUe#ZpdV?VzCxk-Rm+);3(wb8q`(#{e8FI_3z8RwJLQk>}&nRHK0|
zNhvzkFo4$qbT=sr4i@y>Bdr`7j(HfwmH^uc7xH9%r%nnDB_ty3>&opGxGMoP9kf;<
zd%_$N;{SC3V62>WZcCaxpx6frT|FlOj5R5zGbh3vrqY>j1H`{Bkt_d-PcIzGcOeS&
z0OimpMB04AZ5M$FkksHx)9_uX*rDTKrDER^Aij2r>}i8vD4G(OFwKFYV|^yVP5w23
z`asH~GaMjZ={ojt!?Lb#lcy352^1ZBLpqIV|5
zLfz5N09ce%03XI(J-h5`5#>QuTr`wWt<}xj9|=Odm?U{1pyiQF6&>pYfaOUB0`PfX
zSMHvKeKvO?5vfw7-bq{v4vAnDh^?3%L|Q@w6Pmd9iD(;0IfB{ww?bB5NS1mno@&9c
zXC4%!P8Bklxq~Ew%%g071mXR`&iMY{dhWR!JtLt}njRD_-Cxi%N0X&qj~Nq_rI}Yn
za8e0TJ(H#J00000NkvXXu0mjfE=YKA
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/consultation.png b/advanced_project_management_system/static/description/assets/icons/consultation.png
new file mode 100755
index 0000000000000000000000000000000000000000..8319d4baa09d6afac9362dff318f63a0f96f555e
GIT binary patch
literal 1458
zcmV;j1x@;iP)fo-7eN@Nx;}%h)9e^5-C?E
zsEH&b3Z#%2B-}L7v^LRRD&QZ8A<7MshM0yxF7rU)x4)gW;*vW;3
z#hX3&)M|C@Hzy`0dbVF71Cp#6E*?;(1E5ZgN|t#IpsRseZTS;fmL2OZ%G1F2%+iN5
z?1unK-3Ni+4&6W$B|ic7=Z$mSG;E8PyRX^_00(R
zZhUjoBfjtdy_aS#1FePDP8??a5dOFCh
z*MWRv)G@zc9y@oAQ6L5)gF{}MFZh1tt%7=2kn>q6`mgJDye)VpNyeX>nXy(;k)8%5c~P{u8)+YKOVK2Ka7pM_X}a`O
zk#~c24MYp^y)u3b+*+!2>R#%t}=?wy_<
zpYKn-%7CQNC`x``VuKC^f_Kx@zC4JDHDk0HCO^O4#RC{@^;{j6<{9
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/ecom-black.png b/advanced_project_management_system/static/description/assets/icons/ecom-black.png
new file mode 100755
index 0000000000000000000000000000000000000000..a9385ff13f696e96d517a56ce2b2ff7d282c748a
GIT binary patch
literal 576
zcmV-G0>Ax5}Z)a!cc0ra5uqqg5lnhXD
zTbP_`oKdQ!!sJxrjN&KdC#M>hn6H53Z@_@W06J)|I<5r7bODP7TpFfK@D$$y9ro1J
z_#n7|3NU9+Eg3t67i6kk1G7mAm}&y~>LPq;59$DNz9rz_PKFAe2JQYcbvs+lNHw^F+;#7cCP*z(AJ2&$C0H1W+ddn*~CoC?@7snGmV!9
z<==r}6|tyA>`?)>6k{b=2d<=(_5rWxzxsKgUs~Q{+du)!y5s>SG|Pu>T2kaR7OcV&-NYURtom{p?~^a9V+
z7O-a3C?=EC%HIJ!R*hUb72^tZzf-`AuuDDSkJJnF?!xs=oN3JbnbTGPz&Os^S>dl1
z(84w;APbb-b_k@KC|~4YkNmz@^KPH*e34{*2J>2yF9_24A}NIoShST-^{Ye_(vLmm
zd~pgm3F$kIkw;g)NYXe9tbV#5fWaonr$h>8ffe1h+u&f*`C7F2cl-b`l5Ye!`u+O=
O0000##3Xw+{I#MbTYoZ-I?3FUBiCh!QRfyd*8S0
zzBhAFP*6~?-lzdrfLY+Hwprk^9?LDGz;$2=SdFk>z#U*LBaI?QQKD9e7VcUbxCb21
zK<^(;Xc0+8N7+;0G_au`qDwm1ixh;r_7XS;lzSn3Ks%r7fpFK}0T+SIX$T+G&OY=(
zxNCJ_5*Q8nGpO{QD=gKm=?w>jvsI4EeCbfxmVgL)==l)8DLS{4AE!e?Z8#kPQdt|>qP=~
z0Jlc(3Gg?f*M1lL)`j_1YkWB%UdQh2b66h*ZnCzsy7n_B0ckvzW`}^r+Q1XwyiR6N
z+Zb>`kF^u{kzSF3ZWCxE2%MHJ3h_5t<4fjdNthVL50AOsk~o%60t*2`LXkdVyV0$h
z3!el&2Fvm1lW@sw^on`m-Vx`wwB6`P4R}rO
zE6^)ow-A5YnfJ&y0Ye!WLUqzpz$M^$fY4`p?Mdxxh|Yg2?gAd7ipc|DXJ`UZ90Kkq
z5IzMQOgng*oJH-CT;UDiOoqC=IL6w|-va-Bgt_N1s&c*2*98Ry1?!OCgV~htO4|
P00000NkvXXu0mjf_K8qG
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/hotel-black.png b/advanced_project_management_system/static/description/assets/icons/hotel-black.png
new file mode 100755
index 0000000000000000000000000000000000000000..130f613be065b02c7b942088c4d90db37ed8acf3
GIT binary patch
literal 911
zcmV;A191F_P)sqyP_dDm_d+wti*Wu|Jegr#e_!#{@68vYp!)bLlu6Zk`LG>4b)
zEtVJfV|c&7EyFk1UEqgt9*;Njw1VZ>g|{(-Ih??2*p8dxr0-%j^2hNC#&IhqaU^nc
z@$+Ql#-r}>$jwGuyQA&xajp}QpNYQgQvRX3un9j@9GJrg7>xWw!mm^1U#(2=6#lMo
z|KQokEyJGV*$a3$^4H^V!vBQLO`Y#xXJTY1;rCX!>CE#}6@DtiPgnT82{)9?y|d)x
z(wYD^;79DoMQqIQU*HgKi6iBw;@FUI9sNVmM#^uDbMB8mr2J(psR`f_e2lfYQ^?Pc
zD*O(-j!VKyGmVpx8^nFlK|*>Q!@2nVHmt#iLfSnlYCO2
zdFMZq-%%fsUm+%4DcBAM@nlB#OJUtlu?=@5vKyk0-(~c{nEb2TSI|FD&|jC)U02XO
zP_VtPpg&ess@n%zfz}7m^l)@9-pa_g6!iB9hqNkI7IY^HwJpfkw1vjiEIS#Wpt0?`HcKIp}DC=(*S1hNk)FAp#M3(Ph`2hp<^Rwd!~tF
ztxuuW2aq1-#_&}}?@!(9I-!5fU3;7r`rs;-;>L{bUqXMKVkK5&4iq?1871GE)(+iE(2hg+zdgWT>s_5?n3yszX(6k07r<#7z+xi};Iw>y+AElqG*-EPDTmCjr_EtL
l9oc+vR{1Wfk3Rkj{so);rk=IPI$i((002ovPDHLkV1j5u&D{V1
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/license.png b/advanced_project_management_system/static/description/assets/icons/license.png
new file mode 100755
index 0000000000000000000000000000000000000000..a5869797ecaa7583c552c3bb7c9bce5910df78e0
GIT binary patch
literal 1095
zcmV-N1i1T&P)?DLX
z+1Y*BO%2WWvTu05Ki}`p`@J{sJ=nx1)&%L)P@|a%i#deKSU(9Ndee~mRtn|o9hqkt
zsH)g_?j-1Oz*{rH&X9nd_6n5~S%#SclCXXhkhBHYOR<={+%T9HHm_+Rj=iH!?az_sX`LfziH+4|52SPxCd(lFQ#&
zy}6O4ybXVUJ6qGPGqH9kZO+TqO1)ZNXdyA~iK
zjU@8F177OZcQq)~$=N9vU#B7D6{_#K`1J!DzKA!x0H-08MD^1m@!Cu1^1Ay68A9JiW%_
zS;VTfBGKSzreWdMUn09>mmHnKrHDNn2a^cnnZ|MXDzMjuSf_9uLfT_HXSmEliE3?k
zXG5qm?Zm1JIMsm2cnJK_V=hkE@UzgSfJcoDFQBI%WSu~xnTe+6cI1o%43w{m$eK<(
z*6j^w>_69x>X$9vq!B%D)n2i2Fx3eCH`fw(T?A+}`>a(i3QK#4M*6$U2tPE#;4RnK
z>mxwS8DJZNZzlfX70^76^jmNLyX*lJ7YEWlH{
zcu!SGBHwAI5D}|zA|-av#xj{i{y7^5SAdUFv(H6FZ!P*Haqu>f2gqsj_qOq~2-w*F
zS(Vp;I|v^e^)8@E=esPmmg4ZVjs4>wpR8c|FGJSOYN$8)|IM@rI3xAI#QT>#L{?m_|*Crlo{0DLwqmu7G?&JUf
N002ovPDHLkV1nf|8?OKW
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/lifebuoy.png b/advanced_project_management_system/static/description/assets/icons/lifebuoy.png
new file mode 100755
index 0000000000000000000000000000000000000000..658d56cccfbc0e46060ad4850b9fc60c656baf18
GIT binary patch
literal 1199
zcmV;g1W@~lP)K~!jg?OD%n8$}d;Z#;H3_Ux`{Y$>IOhC`GK2Z&mUBGl%91P8y|S)kfJ7y@Fv(h8fJTCuS1y-dl~V3Bn@u?h-V-e;5wUK!dy#X#2mo{Oe@Ws202*N!
zUYebq1*Oz(7=|0J>pn(AT~tHi06fpT5Cp+8=UfzYF~>QdlTyCudEUcDqp?-Q3ClZy
zh`8_jS1ilAN<>A)|0jSkVOiEy-}kQ++2pw<5YcQ91S^cOdS0R|Fvb>wAgB}3_lVdx
zo@Z(pi+`PnCN6%2qaJh2n$9r_fQWby1S^wxWem84@B1sJuai*#Qp(HIeDX(8DwXO|
z%F8CUnE~{Az4MH*g_Fz52gcZf=Xn=0?a~H`hylQ*oZNq<_}k0ls8Xpc6H#iiO$}f$
z7+lQz-Xr3jB4gvg7!%!YH+A(>1Bjw%(UgpcwAQ*+tJSUpz&ZeoCZ;U_SQA3r;GDOJ
z$T;)HSw0bo%R@wVuh)CagoKDRBK{zR*fFtJO3f3|HAFNzMEd>yw@I~AqJ#bY{dp7T
z002bv$W%N4fDmGbh<-J-uT(0DT8^y%5pku|M*#3XBv+M(*h9qcYPH&RL>!t5ih0Vt
zUhhjHdIJES%P?;Pz-K~;bwmtD2ac^kEdHi}cmRNNMD(sw>ZYmi5uOi;=pD!w4*<{v
zfK{c`>d}E?De;q!JM+w*2G6)Xkk{#{&dFU)|KBh!fb9Z)o)nlf5uR}Y
zd|trusm)0`Mppsg1Ndk6r(q8O?g$}n6g)=1h>y{88Rl&O_*4k-$x*rHnJTQfhuU9KK{~
ze{gV+s3kFgxc1mJAwWb%MAv-ZUm~J%N@uP-7z~#3)Ik8So7O{0t+hLy&I_FLR}6^`
z@phbH$Kh*4{3egHFbsdG*XzG0ji){Z*L5FjtyLbvcvB|f%{;ykQM#_XnP!t303zyA
zsq`QZDWumnCUwuh==b}N5RuYsGT*~mt@c!Fo%$4}0j>3>Nw>~uBiXinKZ>Hx$z_=#
zilR=d)w*wDYuue4X>6r_BNNeAsf38{WsIw8wR+FAJ7-+XA!5H;t=^mFN<>lA$s-;h
zXEln5eaCU`PGe7Ktv4OVxtm8kK!NspT#NkddEOtDN@bZbcA|D8B1!;w=r~T1>a_U%
zK%>#vBBJeXx4STU!I1-p7aW^eM`ao&dc|bh_WW=-{0Wl3r~lMizvej3Q$);_Ad@h$
zFS2H{DJ{#|0D#*mX186}-I$d4sUW^)U5g92(PHl7XX2Xm3}<-8@HhS0PsfeRnq&X~
N002ovPDHLkV1i;vH)8+*
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png b/advanced_project_management_system/static/description/assets/icons/manufacturing-black.png
new file mode 100755
index 0000000000000000000000000000000000000000..697eb0e9f2c06e40c9c720df7b80b8f6fac63b34
GIT binary patch
literal 673
zcmV;S0$%-zP)xK~!jg?U=D^6hRope;$f(2!dRQAe>DQQeT=B*H{T+6R=CPGo?i;
zwb3GCV`G=p7B(h-MB0d*S1Kujl2}+MniNSfJM7zGW^Qgb$r_ypLnbqCci)@+?wfB1
zGBPqU+Qfwk`Okp9XM78I>x?Y|Ll1WcSarsR1>c9|Nd%6=HgM!=YaZ@efV=JCJ_>M;
z#tG_7>fmofHqbV*fwqwi6!_g1x2b_In2ly7f%_eJ0o+aC9sujWOnqs7*p2KnX7jli
z;o6OCA9xO2jd1No_NTb+#z~0v;T`Z0zwl|`n*9F~cmiDUaJy7Xk_W&W{K7lHtvX^;
z(Zj6p4`48cdl|FZyT#uaI>0^PBmPpQF;uv%TS5j@xaEcnsPI^=RU1CxAp>3Du_HWW
zz$g4f4a9`I24ccp10CQ#@F~J=WS|GU0)9pwVB0W3xNXY`!W$Ww23{u$x9zmJwG4zl
zNZM#Y1GyGz8>t31fw`hBIdgN;Ml!xCHr9#=MoC1iB|&YhBqA8G
zu?X7OSOnBURJ8DgX)FXmEY-qi6Qc+|;sZf^#TXGy#8}J>ckeKJckY?{hP0VaJzj0X8RhK^60Y~Xz{&a9?$@^
z`*!wmV5Zy_F}!tF1}J$Bj0DI7)BwvuZXk8w60j{qaRkSJJyKzx5OU#xRG|a+LWHFb
zOd6COC^gCslp0b8n(}BvP?neGfxW0~`7uN}P!H_L!mj|jfWyE~sgms!uaGmXN9#VL
z&o{&wH`(XFRQ($pDUuL+1@xib4Gb0l2lVkR;3DeD8LS7k>f__UV1%mzx>4a$5ZEDf
zFs9!N;)lCQb0feM2j7i5gwE^pjd8|FLg;tGbr&DyCbIB3L*hWI<61T88h);WH`i)_
z#w>i!kj#Nyz$P-ET7zx?XMsbOOtb!-1`Gk8B3ufXFR%lU=Ye?%_gs{PuhlItkT`G~
z*iYsNGy_*qE6PdWv?bF996`l@7wT=!Aca~OHVbSKIdC1d{b6GWSPEPQ9$MUMlmo*+
zzeDyaLI);$B1?p11lFKJCR&>;B)yV!00U$$m*(l#18adt5v~eYC$PgCrL2V#6Pa`s
z8YOcQ*O0DT0KSqr0(GRrbsYE};VKANl_YcE0xA?5BdrDarup5doDk*PG&c?`vA8VaO=C>m4%I|X)lqm$yVLT0P+oIdY}GtOrO29vww9VSooqbBNnh
zcu(I|YQ)0zb`*zp)aRe-TomMhG1NxyHQX;fPUPZ16kAXwMG|^ZYrnxPV4v0J8EW^T
zsOZBl9Hv`x%N>1ggc$PASEFSIN{zAurN)2jfOsd(fgd5lQU?Y?lv>E=CtGh+0(VGG
zWW%UGZ@o!Njc1h3(oB}@JmzAS!6!o=#PN)%o0h~rfH{E-AX#fBK07*qoM6N<$
Eg49ZXX8-^I
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/puzzle.png b/advanced_project_management_system/static/description/assets/icons/puzzle.png
new file mode 100755
index 0000000000000000000000000000000000000000..65cf854e7ea72e36142ffc1a407bf2b8355cc85c
GIT binary patch
literal 653
zcmV;80&@L{P)9a`;n_Do>R91)@YfrZ;WIBYI)WE@w%y
z7IC%30~nX`B(&|Bi6!}ZGuBf8IAM^
zQA&SX2=P2@*<+`kI7+k$-1A&gaYV-{Ks?g2#0TH?II!as;HNYK-X1sS_e0Z#CLzvF_5wZZ}7k)9y#mQhdC00000NkvXXu0mjfog*sX
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/restaurant-black.png b/advanced_project_management_system/static/description/assets/icons/restaurant-black.png
new file mode 100755
index 0000000000000000000000000000000000000000..4a35eb939cf065c6f8cf83781a15f357348769da
GIT binary patch
literal 905
zcmV;419tq0P)?`PC*pLe{WG*jTWtl`Uu)I!h(oI7q&uZZ6pM-kw|Ur
zMPftz3s_jOvBN@wkko<{5h@lmjYJTFNYSdk7WZDgxt))5&f8mkk}hV>Idh-qo-=c2
z<}K*Z0h|JE0{hdxYd{s)k+v@ZXMrAIo@0zw;4N@F7c(R11%8u|tpdl>{-S`voX=~=
zI9qe}3E(2Iz)Gr4;kyl(s~mqF&>XN=fMdX2piMb8pcAmd@&I7Dz-K#&h$ije8Ud@c
zgQt)P0N6-UPAX^wv}*@XAr$~{fXT%{gxOL;d7J^}NS&nu>IqNA5SA(ZHvoI3&Qbww
zBrApmt%jI`Qb(zPr3MliEX(6AgxqFAfF%PhK$pZ(DxlHPm#x|JJ?#vOh0iFWL*gX;
zvNkySP6D04&a{0VI7IUG&7=5n`XhX%X!6%0pdIMTwKt`IMHB^02%jlh^`s@_+Eq$X
zUua7+@KNF<74Svq=fdYgTbhAkiIY^oW1*i5PYP{`fFHnsWN@i~VW3~=Tf~(@TO!~V
ziHK=MH!#NJVMOxR&(xQ+UJ$o$y2)oaLNW;@b@MoYxa>1*DRX}LjYb1P&7s^nlmWWk=>z*h>g|NU{%5MtF5CHx%
zsv|6})E_wVDBiwF?G1#>YfMYTD&SYd?mLjjCb;?_Zxs-Gkk1|~y%8;uG6am{&rq!N
z-f4+g1^f)yLT_-QuCw0J!G4)Cg3XY
f0eA)+t%bl}x(3Cqe?`Zc00000NkvXXu0mjfu`-q5
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/service-black.png b/advanced_project_management_system/static/description/assets/icons/service-black.png
new file mode 100755
index 0000000000000000000000000000000000000000..301ab51cb1363cb8a0063c4f9f7cb9cf73c91e10
GIT binary patch
literal 839
zcmV-N1GxN&P)wG}3wsU*IR)z|Z&+>zafrqJwCq*x@FjvNVI2F^z|C
zN%{bO#A+2K9mjI&psYL^8b1O*HWO0*iAfK
zwBzye?BGqTEZN2s-YR-iRRhR^{{@@H!rmxCX)mp)h^Mf|a7g;p*wW?ud=J0RL?CEP
zkEcMj#QI2Tc@Mv*2kEq`DKw7vdi=Jb&-aer)!-Z0qjz+QFK@N1&aRXO}`izA!9+A#$97UmLtKG(#D$V@JG;R0Xua%1u4_kNMazOP^ayYznp(_+pa
zmHp&*7l9|T=r9&<9@|?Ko;a_$GXn6R3=
z-_eWeE8>!NN6sWQh>p|@{|B~~h0NN}OyO(k|0o{Eevvy?ir79Q%G}xZ=i2u5tSHu2
zwf(N(bFnYJT6O^a^n}=lCZF8Nx;w2}uUkB4XPd5v`7Z>im~HzdJMCK7trz|-8@38>5jc3xX@h`{
zh@iEj_%)@#V~J@-!i)2n-XCy!_SC5Qyigi**PVuC+h<}!~>FElyR+PxP0svs|A}^vKikR
z#>I0>S!0;4UyI{*IK1PzbOF;IshL(A_k5A?+#7WY^+>e^YX;p
z=xW)DcRQbIOIo!~v-$kABZfD^J?Ag~CjG!0N_ye{SWo@7I2vn7n(V-R~kb-3M9=yBBG68O-n8v2ber%t!Zu
Pq0ivy>gTe~DWM4f&Ev8V
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/training.png b/advanced_project_management_system/static/description/assets/icons/training.png
new file mode 100755
index 0000000000000000000000000000000000000000..884ca024d71ca9127a5393134632ee92a61b07c4
GIT binary patch
literal 627
zcmV-(0*w8MP)Ji_yZ6G
zgCi9sC+SZOF3B?A-3o?c9a^B`5B^xi{atdGlsx
zfu5coC)9d9*W)+29w+CYx6HE5(7FIXTmz`}IuU&auvT&%3np6<$3JExZ8|Qv1`yF6
z{uK`ZBO-bN;C9iN>oGlP1At#74phASP()5l1Dq?6>v00$qR~ktYISg_G~Q>PN9l*Pyjm+=0joaxS5K;Rj(=Ddy)iyD^P2j9tz7$MRPPN-6X6Ic<
zC{O?T4(yVQo5t(DjmAqa0UQ-9Bj}SmO~ZA+0wO7a=S3S8?~`nFrw($EDaoG!IQ?TF
zt|2?U(I}QLQFZXyQiDB8SX$~v-8kVA@YGU+KFk?f>fJUiwWsHQ*BQQneoi*
zIdjgY7w2;~&-47A-}lQiGr#AVfgU}2^thi$w2V8gP8xe`iYA|^nQ(?HLC@=`7Uk<})
zLeWEQiU$yZ^@<(}ZFDXOrZ=@2KTECwL3TGYp{o5;VR!&Zenfb(Y~lunk>o@WhF_@a
z!ghmmZ=oQx3ZUrTMV_|@z*@URl_LrpnuMspmx02LayE1`&DBGH7
zIB$fJR!y{I;6E2v5gyA7yJ&>%uIrAsk}Qk0c3q+z1eRyI&Umi#qKMSynj`laxQDEG
z$>9=BWqAjWxCde)_&ZYtQ_uHfppNAb)C&iMgDG4Yayz-APl492qWnZ
z+2s4qPerk;Qd
zRTxgcUKCf(0QEW%Si8S$d^23v9Y;Bm$|Jh7D5kUlU|v?DQjz!5DcCSIHI;o!&C;0x
zy1x?jTA~w;DMb2S$s6C7*Wr6^*LJGyqHt8;>Dg;xBk)zTu^q3#d?0F4bwS{Xys;0Y
z0b}%PxF6sy{*u>yU@TD!7kg>wn=-H#OA+vz;H27KSYpwM_&kp%X2ny`^Yp0@|(y-wyRtOEu)
zkZMr2S!>sIk}ylBD^a-LQPoOlqjSJ;L-U^%BWoPTxn4GDGXiV(qm1VDmv{z1L}Jvu
zn`vGi$NH_RE@&E5g2~Cr0o8JExjDBIzCUyV^vhJEFcOB*@hFO_Ws){xtzG=^;Lve_
zQnzMHdm+ztcL8TpjlxKr=$THQiK!@hAyIz4N4%2V3+2+10THPgVGEG`aJ3>)#)7~e
zj-qI|S!^?IMA7OXjJ}pce+C{;_v(adyt>r~yRAcuwRTCOd=IQ`K0+rHj*6O7#^_|N
zR=ZNIR{yzq^QL#_j;<2XwFs{P&o>X}q=;_wJnsh7KQIfj8}c9GwohHEy0HGyN#1EU
zwtz&CPhEFtR77q!cFdS4^%iP|h}3+~+kwg^h2P66zKc$%k(WHr*_9O!^)V)55l)iG=bkroSVWSt8oK?9X|oC&>t|S94mi~JQz6J@L4Q+~({Wt+
nVe#UD%iYS|qeqV(_m6)8sc^)gW+q6200000NkvXXu0mjfv*t}m
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/icons/user.png b/advanced_project_management_system/static/description/assets/icons/user.png
new file mode 100755
index 0000000000000000000000000000000000000000..6ffb23d9f036834a32954f83bcfeca00790ee443
GIT binary patch
literal 988
zcmV<210(#2P)cAU
zg%n1_!UO~hi=Zajq!7VI@CUR>p`!Rx*a$&o3k`~bXb@RtC1&nyR*WQ@xp&s=+|MHZ
z%qBDA%sD6P7W>?P9RqF}kWv6&A-zOAepFK7
zn%moe*=$Tc@)I0INT*#4Q(tpt!c>;Iw0DH*Nr(MZj6)>|hd7}=D`NRPh
zXvGuSy!q^~M868;^;_^453rHAwcCa0XTYMJUi@XTxY>o~XCPvW7k?SF)lGsQoZDZQ
zP)=G_j{)g77n-L5oA={)hSIDH&Cfs)ee1>VM9F4cXnqDNc7ia=s32eb!iDI$gsOi4
zLvKEpLvw7Jbc*9=pw+k^81;$)fYoTt-RZ*gtblIt<9DK%bYb~+p`ZNt9gylSG|w)y
z^f7S3E5=1EFtYA*7owK|ZMZhYc+MxrUpVY~%?xuR%hGp%`<%$)6(zO(uDSg$G#5pD
z;K6<0FLeNz{gRNEPQuWq)1OJI*Gp=<<_=N;X(Gq;tOM~GAMp_MS;a)29s}JqVCIjM
z)b8=k8|EJXBpK4+2QuS_5P5?c0HB~e#B8sn^Ebj8h&ak%8{2szdo@hTfKXDKM!FmH
zW1nf?P!ziqZws=70=&$bXf^g?93W~xqS9P$i-O)xkbdQkw>_W_=3j
zHL&MZ+4h#Vli`J@6>FxCSeAZmS!$N0X3g}h<>^5?bLOg^ymRRmYovK~+eD>9insPXvj3+6Gb@v&hmf9xq1t2!EP|dQ8Gk{Nb(_%F
zfZ2)l~DhpZ1%x!dRjm
zO=;u!cb$X1D_}gv>Jbl6rqq7)(!s6*&8$S;I1dcnm#;8RsZyKh9Ozzw#ra8ApLl@n
zmu`~X4VYcGB63`?zPU_W_r4w%$5|}xSP?5ge^6@en%S9MO4}qmpBLGc
z+0FjUY-Um~^1{NNbKdiv_nq_2d}juhaAqNAYGGAPQ!by+?CdIx=|Q!EF@IoLzlew*
zHqN3N&|>jiL`D#~5!H3TiYBy2#kO~cjhT*5UTf&o)WxJyJAvB(gK7(+j!7;TT0A7Y
z1FE_V&)W$+3}iZx$0V2A6?Kio3}~@vBQg$L-C2d~l5BRYn{^UNAuSXJ5cvdH*O{zi
zV%uGb2Qb}EY>Q0hdBTeCB5i_*J%!Y9hB4-|&cua_ha`5unC%@oF^Pv{Qs|lv<4<)f
zUXLH|SJ!zQN!xgltnuI
zA*#cGrK&x(v3Ly_Q|`zSxko)OA2y^qPL@<^KO#f_bvjN$1}w`3PIqAS3hH^A
zP<=n*vz)54C3ehdJM0g+#tCDPU9e*A9n+;vw!rRxEBni5
z)-Ry*UUp(jA$8sBfPFx3TrnGPh-`L9MCxAWV%Y)pyc>XbNlyG}DwX>i#X}4RsyFRk
zVEIC0wZTI&IM}qlEXaTsi?^UUPIBUXU{q}T#a4t=w~?!r^mSlaglPrljv8T7?RP}(
z65D>Q9jU9ESY3A%*b`~K>IAlZtB6c%p|F}v<_biHP`wm58|VX$0ly;h9+vfvh)j11
z8_9sG3ZAzI7>zOy_>^pRvxuCEIIkl@7qaR%o>zf8Bd&3X>FJx35Dy`DKpiKGG2_6-
zi1EL|_pg8qr_|L-ofg+klMsFq4s0+U^c|Cvl?
zW76WGjRAGt5q$puurgxIe=ugV^!5FI`VHxE7Je0$oQCSazOkXL=HEJ@iy7)<8ccM
zi$(+ef&T;QIOo)jsy2Ql_>yw@-e%|Y#X_Tj-|AYa)EhMu>Nvyr{xgBmKbe`?Dr?r9
zOju)E)IDj`^R}b-mDwQojt1IgQcl=+(LyKais%c845mdJTs}XVW{eu|uie$6SB5Pd25|YHf6OMZB
Tt+q0v00000NkvXXu0mjf(ZE2?
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/misc/categories.png b/advanced_project_management_system/static/description/assets/misc/categories.png
new file mode 100755
index 0000000000000000000000000000000000000000..bedf1e0b189ab85a0800d2bf16f8907ae0f9b225
GIT binary patch
literal 1532
zcmZ{keKgZ+9Kav<&g)v_b;hk!gv>VTU}Ro~txRZnf7vk1>ts^0E+H?ytaOVCAAtJwqh7z>jo|))?0E=;^I0L}r!q@1EP`)*ij%*d2<}K;)isHiUuO(K8sRsh
z-Pis3{YvV^@OQmmNs&NQU=)KXv{AlE^1MknPJ@r9OQ`&Nj0POs^TNY&qa1m>k$^h9D8PU8DqJ&&5k(K{sH@
z>V&X6c_01q(%2SvYvLlvZnd>@@hKBUnCj~2ChNaWzfP;#&qp?|WQ{%Kh@)Q3?|Ni0
z=(zu3N5auKDLJw+J9M|2X2;&ImwC4Jf<@^EEM+385H^D2h1?zJ3CZs;Z5fLh)hk%5
z92LCeycC`uoi_YZVuu}XVj@bJ4%>5%sl%Pd2NlL!H`UvThTU6LJEXe^gn}6qo&D*^
zm^{E}_)%2m+Lg7mTKSD%vkXWsw?3^(z8CV2X1=Ih+$)FISZ`Q1W>#&(U;Pf3754az
zInOwxDLL*iQ+nNfq^Y+ffJ{jKv)@>P_0P3jxYZ!D3cFG&Z(+^{gBw2KslvLZ6k9pp
zcav^CwSZWm8XpNq>1*NKY-M4jgw>z=OfFMf(-%Ced^p_UI?=L>ul247laA={vAc40
z&MbkA
zQp*daY+?&xt97XHt%JJN_4~;wCD(^h2BpL1xp@X^wlU;+cG@IQw(58Lm3j6ZZ+dn9)
zlL|m@Tzt8QBUiJiT2oW)3o_`6!%f0b4fhFzCeI?t)lB#3@yOj}Mt_vsQ;lPFV#O6{
z#%pHl7`Xv@3G+~0gf4=9HDk7006U7#X5b?aGavvftd$iSYlF73p<;LAaeMIAHoLG`
zJQn*_0WSNWkeD3Bj6U{lp)90@1PP}9O<*$<8L4b~BJ10ZkX&2>Ie_fuMQn7To%{z~
C2BR$i
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/misc/check-box.png b/advanced_project_management_system/static/description/assets/misc/check-box.png
new file mode 100755
index 0000000000000000000000000000000000000000..42caf24b98062c6ea6bb4a636808964262e04e64
GIT binary patch
literal 1118
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
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/misc/cybrosys-logo.png b/advanced_project_management_system/static/description/assets/misc/cybrosys-logo.png
new file mode 100755
index 0000000000000000000000000000000000000000..cc3cc0ccfdaf8dff2e8ebcb010e24ad9e636b494
GIT binary patch
literal 4496
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
B&Kv*$
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/misc/logo.png b/advanced_project_management_system/static/description/assets/misc/logo.png
new file mode 100755
index 0000000000000000000000000000000000000000..478462d3e73d73cc9bae9fea8e7f8fac84fab049
GIT binary patch
literal 3452
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
e!*|2?|H>Z_>p))&1OWs90000l?
zWKy}bLYpqAEQ(GYLL;Gb(D`-#IL~wb=zX5=`+48*`+lDHkMH++vpn2fWTn-m0RWIC
z9Kam{srDn};o#iz@f{BYjOs*k0)QL&sI?$TaIX_`;1CG_67>Kel?4EQfvMC#0pJ80
z0A>OKz_uI!ROyu+p7!7YJlNF*2NE3LoOvlAr055ZFhBlyRK=FmTchU@1VS5t^%)rBQM9x$MwS_
zIXL28E0Jutq+4j;o%BRKk^5frRo5||pMzOotWxt7e`AC8&_%_GFa5wg4|BIgM?sHX}t!3?X6PLp4$UBYR*G4H&
zMWX78_VXrTlyZUMxJRvzIRlyY?ck;R``%gwo;iG&QYPkRhHGmxV&U|J?Y^rE3saY1
zG~M-*5Q7+U3lPx5rh}=!OE26Gy*noAY^$SS1z(p>+80-3tY&2q4P(pi=oiXZbv==y
zXNz%@hg?y+v5^*UM&psGr?#W?#oy?vVT!Nq;xo2R2u5H<#RL5qj7dO4ac@0F^!ngf
z&PKr*uOm|Ap(E|9ZzYaPLWnC%tr3r8Ip>Osz(!1gNeva3Mwcv72UG3Cw(^a2VSqj+
zi^Gw7-K8=_q3X|GY3d)JcoS`y2fuJ>cPr!LN#P&A2aWB|#WZhQ72J@Mi-2%_f2*#Y
zN>HTSP7l8m-qvJ*mJe2QXf)d?xw#rCH_dEO(a3Z^O8y(8pbhe*mx~XuA}pYj%F=G$6K(s;ly_O+L&wbDL`GV~pO~%~
zb-PH}OteCdwx9+4m(buZi#6EN`j}3e6EiuG#AL|cKo&hdUL+J{m?}#zsV1<9ax%nz
zu6S>pFkEA{-8Z>oTkYo&~Ct(r52;n35<_46W44SR|=yRZb>u`vCFL|O%y
zvHd+g6~vOiaEwWo&Gx1)vM`!ybp5j9d~a2FcK#-HcUG{IW9kF$JJMax#<6T@tbvx@
z$jqUkmA=~0F9J@|)1nwszzpy4gMpl7U8}JtE7}@?iFZV
zi%UJkou|bMX>_Z&mia{Gm1ER8qI{S!4wYU=N;1}ifE8wL*nd%HI-fmC8l2CMv-R~u
zvLDDM5}tj44JzEQ*b$bs1|hT<=)srdA^a+{tvf8CrMN979i}O4ehAemf%4cedr{mn
zGO;GJJ6*4d5f{8kimVX0tGi;q66V;a5r+ll#Tf1JQR?ITA_3c#FgN#Z&wSd7rsk1#
zz@rm(^=;c#Bj>sSsWVIc7rsY+Ik(`8u_yE!zp6Cn)=S25Z^cV3AX(?Dbv!U6gQlBt
zNC{m%*Y<{X>)BW2u_SzBEef}Y{Dt+>dGfohq3m#N@KS^KHSx!Gg!cfYpwHXRC9@B$
z4an`Ay4?85=X%4ZN>1Uk%ZcT8LJ)2eT3WnQW+Lo>r(h_TX1>tfcWOr&Dyk3?X=J36
zKdbY6a*BJb<@)(GsIql|R|Wyu3I4h}nRq`YC5Rbn8xj`^0>Gd#7-O`RF~;gJ+QJrX
zZHvb2LZfZbXvv51_x~qE|3ZlfOZd6KWD8G&g28_;Fe9Qv8O)$)`p=ymdGocP0}$|T
JxMpl%+CQV6u!vJ6b2LQ+{
z08k|5Hl8;V48(lSS)m0K*v8qWXaU4Y)|bKr#QoPfLFWB}1Vpy6w*bw8ppr_kLt{~G
zg3c!!^cfdyd+o&tj0-_-IqKL|DT#v*Tt(VR^p4|6prn%In@+FjDyl+Ba-xF~Di*o1
zx1guX{>c}`ffisl;XpCP%2;L>T(T8x-gJ;p+_7=b(m`FN+@eG_S^4z(swp$6AOG}(RGqLPX`>E|>w!|QLqhG3-1qHCT)(Q)h~`IeQAoQ|B(Fe(k=IQDJyJ-)3slV5N9QB$+<
zu4?=JxT>vkq}G80CL?V-ntJN=@c2yUm&LetGTO2T(#j^OseJ*DCoC?G5Q?B&pWvkm
zOYoE;DdcSqJUen1_q3ZEmgOznZDExTJ)V_&Rh)`E95GzJ4&G^q{F$r}|7E&o>+(ec
z64CLp)6^!M!3fo%=MZluDcd<1WlhCFjp4Bl4#q!@b*1&Xwa{w%sl7v6O-=ScLhV0;
z47)u%PF004qYRdY9GTLSaf>OCK~;YtPt6V3z-srmem%XD3*m0au-^8>2S>(GiYsD)
zpO-i4^Dmc2^2iIJL37{IB_*OpP`gM*{r#;A#$k<&;^~d;9KudWS?k0v&zimPlH?|J
z;knX-i?W2q)DsQlGC4*m`V4HUu4;M&+t4(GUC+0%aXetc60Y;`z{a8cy)H|gYm={j
z;l{W9T$SPNFVBC(rBJ#sc(pp-rX=*iu67=eLx|jWLQcNE{{sE{`T7@1Z)9bD8zf0(
zjj~_mT4SZ%t3rjZ)!{+2vp?nO{UgKK5#yNL>do)RTlsz2bB}HLdTS3{kkn^F2U7gp
zeaCg}X@l?hW~nDsTvy+m_*r&&mzT4%)(9!}{CMT15>^6t%fNQzma@FX@aRa|1l0z*qvGe-ASXo+H75MF{hm1@$B`s6e`mtp!u{1kM23&ZI?Q~aH
zN9c6V;=6*9!4dO;r|zZd$_WOZQV@&;NNnA|Q?IR?yF8?du)`6$l_(0$V9J1RKmcV*
zL8?eOFOMC}v{Q;TXr?v4(8$Y*4M*d5teg-LQu7*+Szj~fKj&n^&=_#Bn>!WDNFV)p
zKhqa@bvz1L=JLch`E!DQQi`PCX&pZg7N>Eq;&or4tJE-I1D?u=@o}LTUVUV9Z1x9K
zl-W1V4UY3U$sz7&6*jVHxCmv$zDA`E312662$dQQFCCh1p7TfJ34T$BgE}dRTB|LT-;YEoNK7ViA>jCqdQH
zKBcB6G4S@&$Lel2T2^;NazX~5d1xAxU`Q7a_L)UzJ8>v}+Nh30S#B5{KE{W0
z#*57t-V&9JQeIkH6N@r-4+)waqjM8>2F_r#b(0B(>Dx`rM_;dK`EU>?=Qro7lB?mj
zx7S_n@%OR(i)Ai{8Me<&+UvtElV8*v3lri0qIr4s
zu+es*p>Y-FhM%-{8Q?+x5Ci4jtTNiRdwT3D*)8iinnteUB|-VY!51KxoFN{psB7JI
zKNn5!NMef%;b~SiLeB68D2@4D9cerQV-6f;Tjg~E`
z?bzd}7Tt$!x1AqrR-WumDLffbZQ^=ao6`5U;WZ~2%Nx&p^xjAh*d9)kkNG}$%5A+VOdR^iev6_9*0mc5>s>W({cMY*pr&6E+Y%Cnm&&+Xg{{c=MKK%dy
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/misc/right-arrow.png b/advanced_project_management_system/static/description/assets/misc/right-arrow.png
new file mode 100755
index 0000000000000000000000000000000000000000..730984a0635c971661c6ccafc2fec83a2dee1632
GIT binary patch
literal 967
zcmeAS@N?(olHy`uVBq!ia0vp^4j?SR1|)y|Tss#?v7|ftIx;Y9?C1WI$O_~uBzpw;
zGB8xBF)%c=0965n8eT9klo~KFyh>nTu$sZZAYL$MSD+10f-TA0-33Sk!B6Mi^+1ZV
zz$3C4NGE{this?wKn8n>r>`sfGj=I%4b4g4AADwDU~2MoaSW-r_4bZ!MsT3Sv5((f
zj=RO|;#kCS=}}7XL8tDJKN>$74xU}fF>8v}j2jEzPD!~~B4D&6V6&)t;iMZW0#n(z
zM5Ri70$rZ#WgS)W=yTpFs=aW@vwOvPpZ>4?exP>p_lE`Vt_v~(ZHIzC=1bq*>z0|h
zL$rJ5x+8)Hu@2<{TBXXnCcMxU`O+qJVZYbXC(k_;P{=m
zoy94kwEF;O_c>0rrT6}e&e$-V*P8MWRF-G>B-@r{Pc42%%tE>x>1&hK=0!iJj_bFU=Io=^F7{M7dD=9_DxO9dJFZ;G)nC3NUIDloLooN-(2f)V94EWEpbZ~Z
zma#f64Z4`2v~cT7d6xV)e1{w_vmT7DkGCt5Ur=3pHLa;*5f
zc07h}=2!o+4~gCP*(>6B_RmB<{nj$JXpjQAjcb8g9~ebTzfTZ+G3jl;^Y7o%?q9u4
zqt|+Q)SXiP9{zRhqs#@~+wA#bT
zfk+J(R@O0J6qFZ;eYtTmFny?&xJHzuB$lLFB^RXvDF!10BO_e{b6q2|5JN*N69X#~
zLu~^CD+2>trOB!&8glbfGSez?Yw)Spo(a^T0k@$fGdH!kBr&%Dw;t&%E;pba22WQ%
Jmvv4FO#tlhdcptz
literal 0
HcmV?d00001
diff --git a/advanced_project_management_system/static/description/assets/misc/star.png b/advanced_project_management_system/static/description/assets/misc/star.png
new file mode 100755
index 0000000000000000000000000000000000000000..2eb9ab29f722b495b4ab0ece3ad21e7b82394f3a
GIT binary patch
literal 1642
zcmZ{kX;cze6o8)_%zz{|jy5T_nC3DXlBrQ{D7dhQ;$CJZkW?-u8k#BY>10{CONm2j
zS(=t;$2D_paV=a*EprsoO3bpw(qZPuoHIYV=iK|<`|kP9`*+i+6h{PXBMbn5aCUNV
zmvO^CiG;{%wRoyg2F1g6WIF(A&cnY2D#_-}K~C;u0Aln2;3fm`RrbV{01$}=VD2CQ
z*n9vq!g&pDdu0pAA)=#$jI#J*-xx2$&*4tK5i%b9H>F2${jvtib|&MYvrtXNjmD2)
z)OG-rbe$dSJbc