@ -0,0 +1,37 @@ |
|||||
|
Project Status Report v9 |
||||
|
======================== |
||||
|
|
||||
|
This module helps to analyse project from various aspects. The excel report will |
||||
|
contain complete project status report with budget, |
||||
|
task analysis, gantt chart and project breakdown charter. |
||||
|
|
||||
|
Features |
||||
|
======== |
||||
|
|
||||
|
* Graphical analysis of overall task. |
||||
|
* Comparison of actual and planned time for the project. |
||||
|
* Comparison of actual and planned budget amount. |
||||
|
* Gantt chart view of task. |
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
To install this module, the libraries called python-xlsxwriter and base64 need to be installed in the system. |
||||
|
You need also the **report_xlsx** |
||||
|
module located in: https://github.com/OCA/reporting-engine/ |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
To configure timesheet for task, |
||||
|
Go to Project --> Configuration --> Settings --> Project Management --> Time on Tasks --> Select Manage time estimation on tasks |
||||
|
|
||||
|
To print project status report, |
||||
|
* Select any project |
||||
|
* Go to print action menu and select project status report. |
||||
|
* specify the date range |
||||
|
* Click on Generate button and download the file |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Developer: Mufeeda C K @ cybrosys |
||||
|
Guidance: Nilmar Shereef @ cybrosys, shereef@cybrosys.in |
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Nilmar Shereef(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# 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 |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import models |
@ -0,0 +1,42 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Nilmar Shereef(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# 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 |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
{ |
||||
|
'name': "Project Status Report", |
||||
|
'summary': """ |
||||
|
Project task Analysis""", |
||||
|
'description': """ |
||||
|
Graphical information of Project from various aspects. Project Task list, Comparison of planned and |
||||
|
actual budget and time duration for the project. |
||||
|
""", |
||||
|
'author': "Cybrosys Techno Solutions", |
||||
|
'company': "Cybrosys Techno Solutions", |
||||
|
'website': "http://www.cybrosys.com", |
||||
|
'category': 'Project', |
||||
|
'version': '0.1', |
||||
|
'depends': ['base', 'project', 'report_xlsx', 'project_timesheet', 'analytic'], |
||||
|
'data': [ |
||||
|
'views/status_wizard_view.xml', |
||||
|
'views/report.xml' |
||||
|
], |
||||
|
'license': 'AGPL-3', |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Nilmar Shereef(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# 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 |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import status_report_wizard |
||||
|
import status_report_xls |
@ -0,0 +1,54 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Nilmar Shereef(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# 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 |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from openerp import models, fields, api |
||||
|
from openerp.exceptions import except_orm |
||||
|
|
||||
|
|
||||
|
class ProjectExtended(models.Model): |
||||
|
_inherit = 'project.project' |
||||
|
|
||||
|
planned_amount = fields.Float('Initially Planned Amount', help='Estimated cost to do the task.') |
||||
|
|
||||
|
|
||||
|
class StatusReportWizard(models.Model): |
||||
|
_name = 'project.status_report' |
||||
|
|
||||
|
date_from = fields.Datetime('Start Date') |
||||
|
date_to = fields.Datetime('End Date') |
||||
|
|
||||
|
@api.multi |
||||
|
def print_report_xls(self): |
||||
|
context = self._context |
||||
|
datas = {'ids': context.get('active_ids', [])} |
||||
|
datas['model'] = 'project.project' |
||||
|
datas['form'] = self.read()[0] |
||||
|
for field in datas['form'].keys(): |
||||
|
if isinstance(datas['form'][field], tuple): |
||||
|
datas['form'][field] = datas['form'][field][0] |
||||
|
if len(datas['ids']) > 1: |
||||
|
raise except_orm('Warning', 'Selection of multiple record is not allowed') |
||||
|
else: |
||||
|
return {'type': 'ir.actions.report.xml', |
||||
|
'report_name': 'project_status_level_report', |
||||
|
'datas': datas, |
||||
|
} |
@ -0,0 +1,332 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2009-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
||||
|
# Author: Nilmar Shereef(<http://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# 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 |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from openerp import fields |
||||
|
import datetime |
||||
|
from openerp.exceptions import except_orm |
||||
|
from dateutil.relativedelta import relativedelta |
||||
|
try: |
||||
|
from openerp.addons.report_xlsx.report.report_xlsx import ReportXlsx |
||||
|
except ImportError: |
||||
|
class ReportXlsx(object): |
||||
|
def __init__(self, *args, **kwargs): |
||||
|
pass |
||||
|
|
||||
|
|
||||
|
class ProjectReportXlsx(ReportXlsx): |
||||
|
|
||||
|
def generate_xlsx_report(self, workbook, data, objects): |
||||
|
sheet1 = "Project plan" |
||||
|
sheet2 = "Notes" |
||||
|
worksheet1 = workbook.add_worksheet(sheet1) |
||||
|
worksheet2 = workbook.add_worksheet(sheet2) |
||||
|
format_main_header = workbook.add_format({'font_size': 14, 'bg_color': 'silver', 'bold': 1, 'border': 1, |
||||
|
'align': 'center', 'valign': 'vcenter'}) |
||||
|
format_header = workbook.add_format({'bold': 1, 'border': 1, 'align': 'center', |
||||
|
'valign': 'vcenter', 'bg_color': 'silver'}) |
||||
|
header = workbook.add_format({'bold': 1, 'border': 1, 'align': 'center', |
||||
|
'valign': 'vcenter', 'bg_color': 'silver'}) |
||||
|
left_header = workbook.add_format({'bold': 1, 'border': 1, 'align': 'center', |
||||
|
'valign': 'vcenter'}) |
||||
|
format_cell = workbook.add_format({'border': 1, 'align': 'center'}) |
||||
|
|
||||
|
# ---------------------Project details-------------------------- # |
||||
|
|
||||
|
date_from = data['form']['date_from'] |
||||
|
date_to = data['form']['date_to'] |
||||
|
tasks = self.env['project.task'].search([]) |
||||
|
if date_from and not date_to: |
||||
|
task = tasks.search([('date_start', '>=', date_from), ('project_id', '=', objects.name)]) |
||||
|
elif date_to and not date_from: |
||||
|
task = tasks.search([('date_start', '<=', date_to), ('project_id', '=', objects.name)]) |
||||
|
elif date_from and date_to: |
||||
|
task = tasks.search([('date_start', '<=', date_to), ('date_start', '>=', date_from), |
||||
|
('project_id', '=', objects.name)]) |
||||
|
else: |
||||
|
task = tasks.search([('project_id', '=', objects.name)]) |
||||
|
|
||||
|
report_date = datetime.datetime.now().strftime("%m/%d/%Y") |
||||
|
completed = effective_hours = planned_hours = 0 |
||||
|
for data in task: |
||||
|
if data.effective_hours: |
||||
|
effective_hours += data.effective_hours |
||||
|
if data.planned_hours: |
||||
|
planned_hours += data.planned_hours |
||||
|
if planned_hours != 0: |
||||
|
completed = str(int((effective_hours * 100) / planned_hours)) |
||||
|
row = col = 0 |
||||
|
worksheet1.merge_range(row, col, row + 1, col + 25, "Project Plan", format_main_header) |
||||
|
row += 4 |
||||
|
worksheet1.merge_range(row, col, row, col + 6, self.env.user.company_id.name, left_header) |
||||
|
row += 2 |
||||
|
worksheet1.merge_range(row, col, row, col + 2, "Project Name", left_header) |
||||
|
col += 3 |
||||
|
worksheet1.merge_range(row, col, row, col + 3, objects.name, format_cell) |
||||
|
col = 0 |
||||
|
row += 1 |
||||
|
worksheet1.merge_range(row, col, row, col + 2, "Report Date", left_header) |
||||
|
col += 3 |
||||
|
worksheet1.merge_range(row, col, row, col + 3, report_date, format_cell) |
||||
|
col = 0 |
||||
|
row += 1 |
||||
|
worksheet1.merge_range(row, col, row, col + 2, "Project Status", left_header) |
||||
|
col += 3 |
||||
|
worksheet1.merge_range(row, col, row, col + 3, objects.state, format_cell) |
||||
|
col = 0 |
||||
|
row += 1 |
||||
|
worksheet1.merge_range(row, col, row, col + 2, "Completed", left_header) |
||||
|
col += 3 |
||||
|
worksheet1.merge_range(row, col, row, col + 3, str(completed) + " %", format_cell) |
||||
|
row += 1 |
||||
|
|
||||
|
if task: |
||||
|
|
||||
|
# ---------------------Pie chart for overall task status-------------------------- # |
||||
|
stage_obj = self.env['project.task.type'].search([]) |
||||
|
stages_all = {} |
||||
|
for obj in stage_obj: |
||||
|
stages_all[obj.name] = 0 |
||||
|
for data in task: |
||||
|
stages_all[data.stage_id.name] += 1 |
||||
|
stages = stages_all.keys() |
||||
|
count = stages_all.values() |
||||
|
percentage = [] |
||||
|
total = sum(count) |
||||
|
for item in range(len(count)): |
||||
|
percentage.append((float(count[item]) / total) * 100) |
||||
|
row = 0 |
||||
|
col = 0 |
||||
|
worksheet2.merge_range(row, col, row + 1, col + 3, "Percentage of Task complete", header) |
||||
|
row += 2 |
||||
|
for item in range(len(stages)): |
||||
|
worksheet2.merge_range(row, col, row, col + 1, stages[item], format_cell) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, int(percentage[item]), format_cell) |
||||
|
col = 0 |
||||
|
row += 1 |
||||
|
chart_pie = workbook.add_chart({'type': 'pie'}) |
||||
|
chart_pie.add_series({ |
||||
|
'categories': '=' + sheet2 + '!$A$3:$A$10', |
||||
|
'values': '=' + sheet2 + '!$C$3:$C$10', |
||||
|
'points': [], |
||||
|
}) |
||||
|
chart_pie.set_title({'name': 'Overall Task Status'}) |
||||
|
worksheet1.insert_chart('A13', chart_pie) |
||||
|
|
||||
|
# # ---------------------Bar chart for Time duration-------------------------- # |
||||
|
chart_bar_t = workbook.add_chart({'type': 'bar'}) |
||||
|
actual_time = planned_time = 0 |
||||
|
for data in task: |
||||
|
if data.planned_hours: |
||||
|
planned_time += data.planned_hours |
||||
|
actual_time += data.effective_hours |
||||
|
data_bar_t = [ |
||||
|
['Planned time', 'Actual time'], |
||||
|
[planned_time, actual_time], |
||||
|
] |
||||
|
col = 6 |
||||
|
row = 0 |
||||
|
worksheet2.merge_range(row, col, row + 1, col + 3, "Time Duration(Hours)", header) |
||||
|
row += 2 |
||||
|
for item in range(2): |
||||
|
worksheet2.merge_range(row, col, row, col + 1, data_bar_t[0][item], format_cell) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, data_bar_t[1][item], format_cell) |
||||
|
col = 6 |
||||
|
row += 1 |
||||
|
chart_bar_t.add_series({'name': 'Time', |
||||
|
'categories': '=' + sheet2 + '!$G$3:$G$4', |
||||
|
'values': '=' + sheet2 + '!$I$3:$I$4', |
||||
|
}) |
||||
|
chart_bar_t.set_title({'name': 'Time Duration'}) |
||||
|
worksheet1.insert_chart('I13', chart_bar_t) |
||||
|
|
||||
|
# # ---------------------Bar chart for Budget-------------------------- # |
||||
|
chart_bar_b = workbook.add_chart({'type': 'bar'}) |
||||
|
actual_amount = planned_amount = 0 |
||||
|
if objects.planned_amount: |
||||
|
planned_amount = objects.planned_amount |
||||
|
account_obj = self.env['account.analytic.line'].search([]) |
||||
|
for acc in account_obj: |
||||
|
if acc.account_id == objects.analytic_account_id: |
||||
|
actual_amount += acc.amount |
||||
|
data_bar_b = [ |
||||
|
['Planned', 'Actual'], |
||||
|
[planned_amount, abs(actual_amount)], |
||||
|
] |
||||
|
col = 6 |
||||
|
row = 6 |
||||
|
worksheet2.merge_range(row, col, row + 1, col + 3, "Budget", header) |
||||
|
row += 2 |
||||
|
for item in range(2): |
||||
|
worksheet2.merge_range(row, col, row, col + 1, data_bar_b[0][item], format_cell) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, data_bar_b[1][item], format_cell) |
||||
|
col = 6 |
||||
|
row += 1 |
||||
|
chart_bar_b.add_series({'name': 'Amount', |
||||
|
'categories': '=' + sheet2 + '!$G$9:$G$10', |
||||
|
'values': '=' + sheet2 + '!$I$9:$I$10', |
||||
|
}) |
||||
|
chart_bar_b.set_title({'name': 'Budget'}) |
||||
|
worksheet1.insert_chart('Q13', chart_bar_b) |
||||
|
|
||||
|
# # ---------------------Task description table 1 -------------------------- # |
||||
|
row = 31 |
||||
|
col = 0 |
||||
|
worksheet1.merge_range(row, col, row, col + 3, "Task", format_header) |
||||
|
col += 4 |
||||
|
worksheet1.merge_range(row, col, row, col + 1, "Assigned to", format_header) |
||||
|
col += 2 |
||||
|
worksheet1.write(row, col, "Priority", format_header) |
||||
|
col += 1 |
||||
|
worksheet1.merge_range(row, col, row, col + 1, "Status", format_header) |
||||
|
col += 2 |
||||
|
row += 1 |
||||
|
for data in task: |
||||
|
assigned_to = "-" |
||||
|
if data.user_id.name: |
||||
|
assigned_to = data.user_id.name |
||||
|
col = 0 |
||||
|
worksheet1.merge_range(row, col, row, col + 3, data.name, format_cell) |
||||
|
col += 4 |
||||
|
worksheet1.merge_range(row, col, row, col + 1, assigned_to, format_cell) |
||||
|
col += 2 |
||||
|
priority = "" |
||||
|
for i in range(int(data.priority)): |
||||
|
priority += "*" |
||||
|
worksheet1.write(row, col, priority, format_cell) |
||||
|
col += 1 |
||||
|
worksheet1.merge_range(row, col, row, col + 1, data.stage_id.name, format_cell) |
||||
|
row += 1 |
||||
|
|
||||
|
# ---------------------Task description table 2 -------------------------- # |
||||
|
row = 14 |
||||
|
col = 0 |
||||
|
worksheet2.merge_range(row, col, row, col + 3, "Task", format_header) |
||||
|
col += 4 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, "Assigned to", format_header) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, "Start", format_header) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, "End", format_header) |
||||
|
col += 2 |
||||
|
worksheet2.write(row, col, "Days", format_header) |
||||
|
col += 1 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, "Status", format_header) |
||||
|
row += 1 |
||||
|
col = 0 |
||||
|
for data in task: |
||||
|
start_date = fields.Datetime.from_string(data.date_start) |
||||
|
start_date1 = start_date.strftime("%m-%d-%Y") |
||||
|
if data.date_end and data.date_end > data.date_start: |
||||
|
end_date = fields.Datetime.from_string(data.date_end) |
||||
|
date_difference = relativedelta(end_date, start_date).days |
||||
|
end_date1 = end_date.strftime("%m-%d-%Y") |
||||
|
else: |
||||
|
date_difference = "-" |
||||
|
end_date1 = "-" |
||||
|
assigned_to = "-" |
||||
|
if data.user_id.name: |
||||
|
assigned_to = data.user_id.name |
||||
|
worksheet2.merge_range(row, col, row, col + 3, data.name, format_cell) |
||||
|
col += 4 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, assigned_to, format_cell) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, start_date1, format_cell) |
||||
|
col += 2 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, end_date1, format_cell) |
||||
|
col += 2 |
||||
|
worksheet2.write(row, col, date_difference, format_cell) |
||||
|
col += 1 |
||||
|
worksheet2.merge_range(row, col, row, col + 1, data.stage_id.name, format_cell) |
||||
|
col = 0 |
||||
|
row += 1 |
||||
|
|
||||
|
# ---------------------Gantt chart view-------------------------- # |
||||
|
worksheet3 = workbook.add_worksheet() |
||||
|
if objects.date_start: |
||||
|
project_start = datetime.datetime.date(fields.Datetime.from_string(objects.date_start)) |
||||
|
else: |
||||
|
project_start = datetime.datetime.date(fields.Datetime.from_string(objects.create_date)) |
||||
|
start_list = [] |
||||
|
days_list = [] |
||||
|
task_list = [] |
||||
|
task_item = 0 |
||||
|
project_end = datetime.datetime.date(datetime.datetime.now()) |
||||
|
for data in task: |
||||
|
if data.date_deadline: |
||||
|
date_end_fmt = datetime.datetime.date(fields.Datetime.from_string(data.date_deadline)) |
||||
|
if date_end_fmt > project_end: |
||||
|
project_end = date_end_fmt |
||||
|
else: |
||||
|
project_end = project_end + datetime.timedelta(days=30) |
||||
|
task_item += 1 |
||||
|
start_date = fields.Datetime.from_string(data.date_start) |
||||
|
start_date1 = datetime.datetime.date(start_date) |
||||
|
if data.date_end and data.date_end > data.date_start: |
||||
|
end_date = fields.Datetime.from_string(data.date_end) |
||||
|
else: |
||||
|
end_date = datetime.datetime.today() |
||||
|
days = relativedelta(end_date, start_date).days |
||||
|
task_list.append(data.name) |
||||
|
start_list.append(start_date1) |
||||
|
days_list.append(days) |
||||
|
headings = ['Number', 'Start date', 'Days'] |
||||
|
data = [ |
||||
|
task_list, |
||||
|
start_list, |
||||
|
days_list, |
||||
|
] |
||||
|
worksheet3.write_row('A1', headings) |
||||
|
worksheet3.write_column('A2', data[0]) |
||||
|
worksheet3.write_column('B2', data[1]) |
||||
|
worksheet3.write_column('C2', data[2]) |
||||
|
chart2 = workbook.add_chart({'type': 'bar', 'subtype': 'stacked'}) |
||||
|
start = 2 |
||||
|
end = start + task_item - 1 |
||||
|
chart2.add_series({ |
||||
|
'name': '=Sheet3!$B$1', |
||||
|
'categories': '=Sheet3!$A$' + str(start) + ':$A$' + str(end), |
||||
|
'fill': {'none': True}, |
||||
|
'values': '=Sheet3!$B$' + str(start) + ':$B$' + str(end), |
||||
|
}) |
||||
|
chart2.add_series({ |
||||
|
'name': '=Sheet3!$C$1', |
||||
|
'categories': '=Sheet3!$A$' + str(start) + ':$A$' + str(end), |
||||
|
'fill': {'color': '#4E73B7'}, |
||||
|
'values': '=Sheet3!$C$' + str(start) + ':$C$' + str(end), |
||||
|
}) |
||||
|
chart2.set_title({'none': True}) |
||||
|
chart2.set_x_axis({'date_axis': True, 'min': project_start, 'max': project_end, |
||||
|
'minor_unit': 2, 'minor_unit_type': 'days', 'major_unit': 1, |
||||
|
'major_unit_type': 'days', 'num_format': 'dd/mm/yyyy'}) |
||||
|
chart2.set_y_axis({'none': True}) |
||||
|
chart2.set_legend({'none': True}) |
||||
|
worksheet1.insert_chart('K31', chart2, {'x_scale': 2, 'y_scale': 1}) |
||||
|
worksheet3.hide() |
||||
|
|
||||
|
else: |
||||
|
raise except_orm('Warning', 'No task to display') |
||||
|
|
||||
|
|
||||
|
ProjectReportXlsx('report.project_status_level_report', 'project.project') |
After Width: | Height: | Size: 158 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,136 @@ |
|||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan">Project Status Report</h2> |
||||
|
<h3 class="oe_slogan">Graphical information of Project from various aspects.</h3> |
||||
|
<h4 class="oe_slogan">Cybrosys Technologies , www.cybrosys.com</h4> |
||||
|
|
||||
|
</div> |
||||
|
<!--<div>--> |
||||
|
<!--<center>--> |
||||
|
<!--This module helps to analyse project from various aspects. The excel report will contain--> |
||||
|
<!--complete project status report with budget, task analysis, gantt chart and project--> |
||||
|
<!--breakdown charter.--> |
||||
|
<!--</center>--> |
||||
|
<!--</div>--> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="row oe_row oe_spaced"> |
||||
|
<div class="col-md-6"> |
||||
|
☀ This Module Helps to Analyse Project in Various Aspects.<br> |
||||
|
☀ Complete Project Status XLS Report with Budget Analysis.<br> |
||||
|
☀ Tasks, Gantt chart XLS Analysis.<br> |
||||
|
☀ Project Breakdown Charter Analysis.<br> |
||||
|
</div> |
||||
|
<div class="col-md-6"> |
||||
|
<div class="oe_bg_img"> |
||||
|
<img class="oe_picture oe_screenshot center-block" src="icon.png" style="margin-top: 0px !important;"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<p><center>Menu View</center></p> |
||||
|
<img src="project_menu_view.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<p><center>Wizard View</center></p> |
||||
|
<img src="project_wizard.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<h3 class="oe_slogan">Project Graphical Overview</h3> |
||||
|
<div class="oe_bg_img"> |
||||
|
<img class="oe_picture oe_screenshot" src="sheet_1.png"> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<h3 class="oe_slogan">Project Informations</h3> |
||||
|
<div class="oe_bg_img"> |
||||
|
<img class="oe_picture oe_screenshot" src="sheet_2.png"> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4 class="oe_slogan">Pie chart for task status</h4> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="pie_chart_task.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<p class='oe_mt32'> |
||||
|
☛ The pie chart of Overall task status. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4 class="oe_slogan">Bar chart for time comparison</h4> |
||||
|
<div class="oe_span6"> |
||||
|
<p class='oe_mt32'> |
||||
|
☛ End user can easily compare the actual and planned time the Project. |
||||
|
</p> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="bar_chart_time.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4 class="oe_slogan">Bar chart for Budget</h4> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="bar_chart_budget.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<p class='oe_mt32'> |
||||
|
☛ To compare the actual and planned budget of the Project. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h4 class="oe_slogan">Project task Bar chart</h4> |
||||
|
<div class="oe_span6"> |
||||
|
<p class='oe_mt32'> |
||||
|
☛ Project task information and the bar chart are there. End user can easily Analysed the Tasks. |
||||
|
</p> |
||||
|
</div> |
||||
|
<div class="oe_span6"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img src="gantt_chart_task.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help.?</h2> |
||||
|
<div class="oe_slogan" style="margin-top:10px !important;"> |
||||
|
<a class="btn btn-primary btn-lg mt8" |
||||
|
style="color: #FFFFFF !important;" href="http://www.cybrosys.com"><i |
||||
|
class="fa fa-envelope"></i> Email </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;" |
||||
|
href="http://www.cybrosys.com/contact/"><i |
||||
|
class="fa fa-phone"></i> Contact Us </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;" |
||||
|
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i |
||||
|
class="fa fa-check-square"></i> Request Customization </a> |
||||
|
</div> |
||||
|
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
||||
|
</section> |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 90 KiB |
@ -0,0 +1,12 @@ |
|||||
|
<openerp> |
||||
|
<data> |
||||
|
<report id="project_status_report_new" |
||||
|
model="project.project" |
||||
|
string="Project Status Report" |
||||
|
report_type="xlsx" |
||||
|
name="project_status_level_report" |
||||
|
file="project_status_level_report" |
||||
|
menu="False" |
||||
|
/> |
||||
|
</data> |
||||
|
</openerp> |
@ -0,0 +1,54 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
<record id="project_view_extended" model="ir.ui.view"> |
||||
|
<field name="name">project.new.form</field> |
||||
|
<field name="model">project.project</field> |
||||
|
<field name="inherit_id" ref="project.edit_project"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//field[@name='resource_calendar_id']" position="after"> |
||||
|
<field name="planned_amount"/> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="project_report_print_wizard_view" model="ir.ui.view"> |
||||
|
<field name="name">project.status.report</field> |
||||
|
<field name="model">project.status_report</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="date_from"/> |
||||
|
<field name="date_to"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<footer> |
||||
|
<button name="print_report_xls" string="Generate" type="object" class="oe_highlight" |
||||
|
style="margin: 0 5px;" context="{'xls_export':1}" icon='gtk-print' widget="url"/> |
||||
|
or |
||||
|
<button string="Cancel" class="oe_link" special="cancel" /> |
||||
|
</footer> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="project_report_wizard_view_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Project Status Report</field> |
||||
|
<field name="res_model">project.status_report</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_id" ref="project_report_print_wizard_view"/> |
||||
|
<field name="target">new</field> |
||||
|
<field name="context">{}</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="project_status_report" model="ir.values"> |
||||
|
<field name="model">project.status_report</field> |
||||
|
<field name="name">xls report</field> |
||||
|
<field name="key2">client_print_multi</field> |
||||
|
<field name="value" eval="'ir.actions.act_window,' + str(ref('project_report_wizard_view_action'))" /> |
||||
|
<field name="key">action</field> |
||||
|
<field name="model">project.project</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</openerp> |