@ -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> |