# -*- coding: utf-8 -*- ############################################################################## # # Cybrosys Technologies Pvt. Ltd. # Copyright (C) 2008-TODAY Cybrosys Technologies(). # Author: Nilmar Shereef() # 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 . # ############################################################################## 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) worksheet3 = workbook.add_worksheet() 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-------------------------- # if ValueError: raise except_orm('Warning', 'Select exactly one project') 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)]) elif date_to and not date_from: task = tasks.search([('date_start', '<=', date_to)]) elif date_from and date_to: task = tasks.search([('date_start', '<=', date_to), ('date_start', '>=', date_from)]) else: task = tasks.search([]) 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: if objects.name == data.project_id.name: 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 = 0 get_product = self.env['product.product'].browse(1) cost_price = get_product.standard_price planned_amount = cost_price * objects.planned_hours account_obj = self.env['hr.analytic.timesheet'].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: if objects.name == data.project_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, 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") print "start_date: ", datetime.datetime.date(start_date).toordinal() 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 = "-" if objects.name == data.project_id.name: 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-------------------------- # 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.name == data.project_id.name: 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() ProjectReportXlsx('report.project_status_report', 'project.project')