diff --git a/project_report/__manifest__.py b/project_report/__manifest__.py index c70c93f..00bc49f 100755 --- a/project_report/__manifest__.py +++ b/project_report/__manifest__.py @@ -23,6 +23,7 @@ 'report/project_timesheet_report_views.xml', 'report/project_revenue_custom_report_views.xml', 'report/project_consultant_custom_report_views.xml', + 'report/cor_project_report_views.xml', ], 'qweb': [ "static/src/xml/base.xml", diff --git a/project_report/report/__init__.py b/project_report/report/__init__.py index 5fcea18..2c47515 100755 --- a/project_report/report/__init__.py +++ b/project_report/report/__init__.py @@ -6,4 +6,5 @@ from . import project_budget_amt_analysis from . import project_timeline_report from . import project_timesheet_report from . import project_revenue_custom_report -from . import project_consultant_custom_report \ No newline at end of file +from . import project_consultant_custom_report +from . import cor_project_report diff --git a/project_report/report/cor_project_report.py b/project_report/report/cor_project_report.py new file mode 100755 index 0000000..6dcb1cc --- /dev/null +++ b/project_report/report/cor_project_report.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, tools, api + + +class CorProjectReport(models.Model): + _name = "cor.project.report" + _description = "COR Project Report" + # _order = 'project_id' + _auto = False + + project_id = fields.Many2one('project.project', string='Project', readonly=True) + employee_id = fields.Many2one('hr.employee', string='Consultant', readonly=True) + #hours_type = fields.Char(string="Hours Type", readonly=True) + price_unit = fields.Float("Hourly Rate") + budgeted_qty = fields.Float(string='Budgeted Hours', digits=(16, 2)) + cost = fields.Float("Budgeted Revenue", default=0.0, store=True) + hours = fields.Float("Timesheet Hour", digits=(16, 2), readonly=True, group_operator="sum") + employee_price = fields.Float(string="Consultant Price") + consultant_cost = fields.Float("Actual Cost") + actual_revenue = fields.Float("Actual Revenue") + profit = fields.Float('Profit', digits=(16, 2)) + profit_per = fields.Float('Porfit(%)', digits=(16, 2)) + # pricing_type = fields.Selection([ + # ('fixed_rate', 'Fixed rate'), + # ('employee_rate', 'Consultant rate') + # ], string="Pricing", readonly=True) + # project_type = fields.Selection([ + # ('hours_in_consultant', 'Hours are budgeted according to a consultant'), + # ('hours_no_limit', 'Total hours are budgeted without division to consultant'), + # ], string="Project Type", readonly=True) + + def init(self): + '''Create the view''' + tools.drop_view_if_exists(self._cr, self._table) + self._cr.execute(""" + CREATE OR REPLACE VIEW %s AS ( + SELECT ROW_NUMBER() OVER() as id, + aa.project_id AS project_id, + aa.employee_id AS employee_id, + bb.price_unit AS price_unit, + bb.budgeted_qty AS budgeted_qty, + bb.cost AS cost, + bb.employee_price AS employee_price, + SUM(aa.unit_amount) AS hours, + (SUM(aa.unit_amount) * bb.employee_price) AS consultant_cost, + (SUM(aa.unit_amount) * bb.price_unit) AS actual_revenue, + ((SUM(aa.unit_amount) * bb.price_unit)- (SUM(aa.unit_amount) * bb.employee_price)) AS profit, + ((((SUM(aa.unit_amount) * bb.price_unit)- (SUM(aa.unit_amount) * bb.employee_price))/(SUM(aa.unit_amount) * bb.price_unit))*100) AS profit_per + FROM account_analytic_line aa + Left JOIN project_sale_line_employee_map bb ON bb.project_id = aa.project_id and bb.employee_id = aa.employee_id + GROUP BY aa.project_id, aa.employee_id,bb.price_unit,bb.budgeted_qty,bb.cost,bb.employee_price + )""" % (self._table,)) diff --git a/project_report/report/cor_project_report_views.xml b/project_report/report/cor_project_report_views.xml new file mode 100755 index 0000000..3eefb93 --- /dev/null +++ b/project_report/report/cor_project_report_views.xml @@ -0,0 +1,79 @@ + + + + + cor.project.report.pivot + cor.project.report + + + + + + + + + + + cor.project.report.graph + cor.project.report + + + + + + + + + + + cor.project.report.tree + cor.project.report + + + + + + + + + + + + + + + + + + + + cor.project.report.search + cor.project.report + + + + + + + + + + + + + + + COR Project Report + cor.project.report + tree,pivot,graph + + {'search_default_group_by_project': 1, 'default_res_model': 'cor.project.report'} + + + + + diff --git a/project_report/security/ir.model.access.csv b/project_report/security/ir.model.access.csv index 4969da6..74b448a 100755 --- a/project_report/security/ir.model.access.csv +++ b/project_report/security/ir.model.access.csv @@ -13,3 +13,5 @@ access_project_revenue_custom_report_manager,project_revenue_custom_report_manag access_project_revenue_custom_report_user,project_revenue_custom_report_user,model_project_revenue_custom_report,project.group_project_user,1,0,0,0 access_project_consultant_custom_report_manager,project_consultant_custom_report_manager,model_project_consultant_custom_report,project.group_project_manager,1,1,1,1 access_project_consultant_custom_report_user,project_consultant_custom_report_user,model_project_consultant_custom_report,project.group_project_user,1,0,0,0 +access_cor_project_report_manager,cor.project.report,model_cor_project_report,project.group_project_manager,1,1,1,1 +access_cor_project_report_user,cor.project.report,model_cor_project_report,project.group_project_user,1,0,0,0