@ -0,0 +1,35 @@ | 
				
			|||
Project Status Report v8 | 
				
			|||
======================== | 
				
			|||
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 Settings --> Invoicing --> Accounting & Finance --> Features --> Check Analytic accounting | 
				
			|||
Go to Settings --> Project --> Project management --> Task --> Check Record timesheet lines per 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) 2008-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,45 @@ | 
				
			|||
# -*- coding: utf-8 -*- | 
				
			|||
############################################################################## | 
				
			|||
# | 
				
			|||
#    Cybrosys Technologies Pvt. Ltd. | 
				
			|||
#    Copyright (C) 2008-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': """ | 
				
			|||
        Detailed Project Analysis with XLS Diagrams""", | 
				
			|||
    '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': '1.0', | 
				
			|||
    'depends': ['base', 'sale', 'project', 'report_xlsx', 'hr_timesheet', 'analytic', 'hr_timesheet_sheet'], | 
				
			|||
    'data': [ | 
				
			|||
        'views/status_wizard_view.xml', | 
				
			|||
        'views/report.xml' | 
				
			|||
    ], | 
				
			|||
    'license': 'AGPL-3', | 
				
			|||
    'images': ['static/description/banner.jpg'], | 
				
			|||
    'installable': True, | 
				
			|||
    'auto_install': False, | 
				
			|||
} | 
				
			|||
@ -0,0 +1,24 @@ | 
				
			|||
# -*- coding: utf-8 -*- | 
				
			|||
############################################################################## | 
				
			|||
# | 
				
			|||
#    Cybrosys Technologies Pvt. Ltd. | 
				
			|||
#    Copyright (C) 2008-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,55 @@ | 
				
			|||
# -*- coding: utf-8 -*- | 
				
			|||
############################################################################## | 
				
			|||
# | 
				
			|||
#    Cybrosys Technologies Pvt. Ltd. | 
				
			|||
#    Copyright (C) 2008-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] | 
				
			|||
        print datas | 
				
			|||
        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_report', | 
				
			|||
                    'datas': datas, | 
				
			|||
                    } | 
				
			|||
@ -0,0 +1,319 @@ | 
				
			|||
# -*- coding: utf-8 -*- | 
				
			|||
############################################################################## | 
				
			|||
# | 
				
			|||
#    Cybrosys Technologies Pvt. Ltd. | 
				
			|||
#    Copyright (C) 2008-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 | 
				
			|||
from openerp.exceptions import except_orm | 
				
			|||
import datetime | 
				
			|||
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-------------------------- # | 
				
			|||
 | 
				
			|||
        report_date = datetime.datetime.now().strftime("%m/%d/%Y") | 
				
			|||
        if objects.effective_hours and objects.planned_hours: | 
				
			|||
            completed = str(int((objects.effective_hours * 100) / objects.planned_hours)) + " %" | 
				
			|||
        else: | 
				
			|||
            completed = "Unknown" | 
				
			|||
        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, completed, format_cell) | 
				
			|||
        row += 1 | 
				
			|||
 | 
				
			|||
        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)]) | 
				
			|||
        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'}) | 
				
			|||
            planned_time = objects.planned_hours | 
				
			|||
            actual_time = objects.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: | 
				
			|||
                col = 0 | 
				
			|||
                worksheet1.merge_range(row, col, row, col + 3, data.name, format_cell) | 
				
			|||
                col += 4 | 
				
			|||
                worksheet1.merge_range(row, col, row, col + 1, data.user_id.name, 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 = "-" | 
				
			|||
                worksheet2.merge_range(row, col, row, col + 3, data.name, format_cell) | 
				
			|||
                col += 4 | 
				
			|||
                worksheet2.merge_range(row, col, row, col + 1, data.user_id.name, 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 objects.date: | 
				
			|||
                    project_end = datetime.datetime.date(fields.Datetime.from_string(objects.date)) | 
				
			|||
                else: | 
				
			|||
                    if data.date_end: | 
				
			|||
                        date_end_fmt = datetime.datetime.date(fields.Datetime.from_string(data.date_end)) | 
				
			|||
                        if date_end_fmt > project_end: | 
				
			|||
                            project_end = date_end_fmt | 
				
			|||
                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 Information</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 & Planned Time of 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 & 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 & Bar Charts are there. End User Can Easily Analyse 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: 82 KiB  | 
| 
		 After Width: | Height: | Size: 61 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,55 @@ | 
				
			|||
<?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='privacy_visibility']" 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_mode">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> | 
				
			|||