From ec7067c6c198c449c65cf7475596bb4e412f2084 Mon Sep 17 00:00:00 2001 From: prakash Date: Mon, 28 Mar 2022 12:18:35 +0530 Subject: [PATCH] Project Revenue and consultant reports updated --- project_report/__manifest__.py | 2 + project_report/report/__init__.py | 2 + .../report/project_budget_amt_analysis.py | 52 +---- .../project_budget_amt_analysis_views.xml | 13 +- .../project_consultant_custom_report.py | 58 ++++++ ...project_consultant_custom_report_views.xml | 82 ++++++++ .../report/project_revenue_custom_report.py | 188 ++++++++++++++++++ .../project_revenue_custom_report_views.xml | 94 +++++++++ project_report/security/ir.model.access.csv | 6 +- 9 files changed, 445 insertions(+), 52 deletions(-) create mode 100755 project_report/report/project_consultant_custom_report.py create mode 100755 project_report/report/project_consultant_custom_report_views.xml create mode 100755 project_report/report/project_revenue_custom_report.py create mode 100755 project_report/report/project_revenue_custom_report_views.xml diff --git a/project_report/__manifest__.py b/project_report/__manifest__.py index 8cae31e..c70c93f 100755 --- a/project_report/__manifest__.py +++ b/project_report/__manifest__.py @@ -21,6 +21,8 @@ 'report/project_budget_amt_analysis_views.xml', 'report/project_timeline_report_views.xml', 'report/project_timesheet_report_views.xml', + 'report/project_revenue_custom_report_views.xml', + 'report/project_consultant_custom_report_views.xml', ], 'qweb': [ "static/src/xml/base.xml", diff --git a/project_report/report/__init__.py b/project_report/report/__init__.py index d635724..5fcea18 100755 --- a/project_report/report/__init__.py +++ b/project_report/report/__init__.py @@ -5,3 +5,5 @@ from . import project_budget_hrs_analysis 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 diff --git a/project_report/report/project_budget_amt_analysis.py b/project_report/report/project_budget_amt_analysis.py index b304e68..c5dce57 100755 --- a/project_report/report/project_budget_amt_analysis.py +++ b/project_report/report/project_budget_amt_analysis.py @@ -32,10 +32,6 @@ class BudgetAmtAnalysis(models.Model): end_date = fields.Date(string='End Date', readonly=True) timesheet_date = fields.Date(string='Timesheet Date', readonly=True) timesheet_sdatetime = fields.Datetime(string='Timesheet Start Time', readonly=True) - unit_amount = fields.Float('Timesheet Hours') - timesheet_cost = fields.Float('Timesheet Cost') - profit_per = fields.Float(string='Porfit Percentage', digits=(16, 2)) - profit_amt = fields.Float(string='Profit Amount', digits=(16, 2)) #budgeted_revenue = fields.Float("Budgeted Revenue", digits=(16, 2), readonly=True, group_operator="sum") #actual_revenue = fields.Float("Actual Revenue", digits=(16, 2), readonly=True, group_operator="sum") @@ -44,9 +40,7 @@ class BudgetAmtAnalysis(models.Model): tools.drop_view_if_exists(self._cr, self._table) self._cr.execute(""" CREATE OR REPLACE VIEW %s AS ( - SELECT ROW_NUMBER() OVER() as id, project_id, parentproject as parent_project, - start_date, end_date, timesheet_date, timesheet_sdatetime, unit_amount, timesheet_cost, partner_id, employee_id, amount_type, - profit_per, profit_amt, pricing_type, project_type, revenue from ( + SELECT ROW_NUMBER() OVER() as id, project_id, parentproject as parent_project, start_date, end_date, timesheet_date, timesheet_sdatetime, partner_id, employee_id, amount_type, pricing_type, project_type, revenue from ( SELECT pro.id AS project_id, (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, @@ -55,14 +49,10 @@ class BudgetAmtAnalysis(models.Model): pro.partner_id AS partner_id, pro_emp.employee_id AS employee_id, 'Budgeted Revenue' as amount_type, - pro.profit_per, - pro.profit_amt, pro.pricing_type as pricing_type, pro.project_type as project_type, null::date AS timesheet_date, null::timestamp AS timesheet_sdatetime, - 0.0 as unit_amount, - 0.0 as timesheet_cost, pro_emp.cost AS revenue FROM project_project pro Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id @@ -76,23 +66,18 @@ class BudgetAmtAnalysis(models.Model): pro.partner_id AS partner_id, AAL.employee_id AS employee_id, 'Actual Cost' as amount_type, - pro.profit_per, - pro.profit_amt, pro.pricing_type as pricing_type, pro.project_type as project_type, AAL.date AS timesheet_date, AAL.start_datetime AS timesheet_sdatetime, - AAL.unit_amount as unit_amount, - emp.timesheet_cost as timesheet_cost, - (AAL.unit_amount * pro_emp.employee_price) AS revenue + (sum(AAL.unit_amount) * pro_emp.employee_price) AS revenue FROM project_project PRO Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id and AAL.employee_id = pro_emp.employee_id - LEFT JOIN hr_employee emp on AAL.employee_id = emp.id WHERE PRO.active = 't' and AAL.employee_id is not null and PRO.pricing_type = 'employee_rate' and PRO.project_type in ('hours_in_consultant', 'hours_no_limit') - --group by pro.id, aal.employee_id, aal.date, aal.start_datetime, pro_emp.employee_price, AAL.unit_amount + group by pro.id, aal.employee_id, aal.date, aal.start_datetime, pro_emp.employee_price union SELECT pro.id AS project_id, @@ -102,21 +87,16 @@ class BudgetAmtAnalysis(models.Model): pro.partner_id AS partner_id, AAL.employee_id AS employee_id, 'Actual Revenue' as amount_type, - pro.profit_per, - pro.profit_amt, pro.pricing_type as pricing_type, pro.project_type as project_type, AAL.date AS timesheet_date, AAL.start_datetime AS timesheet_sdatetime, - AAL.unit_amount as unit_amount, - emp.timesheet_cost as timesheet_cost, - (AAL.unit_amount * pro.hourly_rate) AS revenue + (sum(AAL.unit_amount) * pro.hourly_rate) AS revenue FROM project_project PRO LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id - LEFT JOIN hr_employee emp on AAL.employee_id = emp.id WHERE PRO.active = 't' and PRO.pricing_type = 'employee_rate' and PRO.project_type = 'hours_no_limit' - --group by pro.id, aal.employee_id, aal.date, aal.unit_amount, aal.start_datetime, AAL.unit_amount + group by pro.id, aal.employee_id, aal.date, aal.unit_amount, aal.start_datetime union SELECT pro.id AS project_id, @@ -126,14 +106,10 @@ class BudgetAmtAnalysis(models.Model): pro.partner_id AS partner_id, null::int AS employee_id, 'Budgeted Revenue' as amount_type, - pro.profit_per, - pro.profit_amt, pro.pricing_type as pricing_type, pro.project_type as project_type, null::date AS timesheet_date, null::timestamp AS timesheet_sdatetime, - 0.0 as unit_amount, - 0.0 as timesheet_cost, pro.budgeted_revenue AS revenue FROM project_project pro --Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id @@ -147,22 +123,17 @@ class BudgetAmtAnalysis(models.Model): pro.partner_id AS partner_id, AAL.employee_id AS employee_id, 'Actual Revenue' as amount_type, - pro.profit_per, - pro.profit_amt, pro.pricing_type as pricing_type, pro.project_type as project_type, AAL.date AS timesheet_date, AAL.start_datetime AS timesheet_sdatetime, - AAL.unit_amount as unit_amount, - emp.timesheet_cost as timesheet_cost, - (AAL.unit_amount * pro_emp.price_unit) AS revenue + (sum(AAL.unit_amount) * pro_emp.price_unit) AS revenue FROM project_project PRO Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id and AAL.employee_id = pro_emp.employee_id - LEFT JOIN hr_employee emp on AAL.employee_id = emp.id WHERE PRO.active = 't' and AAL.employee_id is not null and PRO.pricing_type = 'employee_rate' and PRO.project_type = 'hours_in_consultant' - --group by pro.id, aal.employee_id, aal.date, aal.start_datetime, AAL.unit_amount, pro_emp.price_unit + group by pro.id, aal.employee_id, aal.date, aal.start_datetime, pro_emp.price_unit union SELECT pro.id AS project_id, @@ -172,19 +143,14 @@ class BudgetAmtAnalysis(models.Model): pro.partner_id AS partner_id, AAL.employee_id AS employee_id, 'Actual Cost' as amount_type, - pro.profit_per, - pro.profit_amt, pro.pricing_type as pricing_type, pro.project_type as project_type, AAL.date AS timesheet_date, AAL.start_datetime AS timesheet_sdatetime, - AAL.unit_amount as unit_amount, - emp.timesheet_cost as timesheet_cost, (AAL.amount * -1) AS revenue FROM project_project PRO LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id - LEFT JOIN hr_employee emp on AAL.employee_id = emp.id --and AAL.employee_id = pro_emp.employee_id WHERE PRO.active = 't' and PRO.pricing_type = 'fixed_rate') as res @@ -192,6 +158,4 @@ class BudgetAmtAnalysis(models.Model): project_id, amount_type desc --group by Pro.id, PRO.partner_id, Pro.budgeted_revenue, AAL.amount - )""" % (self._table,)) - - + )""" % (self._table,)) \ No newline at end of file diff --git a/project_report/report/project_budget_amt_analysis_views.xml b/project_report/report/project_budget_amt_analysis_views.xml index 49a75be..4b9c9af 100755 --- a/project_report/report/project_budget_amt_analysis_views.xml +++ b/project_report/report/project_budget_amt_analysis_views.xml @@ -6,9 +6,8 @@ project.budget.amt.report - - - + + @@ -20,7 +19,9 @@ - + + + @@ -35,7 +36,6 @@ - @@ -80,7 +80,6 @@ project.budget.amt.report graph,tree,pivot - {'search_default_group_by_project': 1,'search_default_group_by_amount_type': 1, 'default_res_model': 'project.budget.amt.report', 'search_default_notfixed':1} @@ -90,4 +89,4 @@ name="Projects Revenue Acutal Vs Budget" sequence="50"/> - + \ No newline at end of file diff --git a/project_report/report/project_consultant_custom_report.py b/project_report/report/project_consultant_custom_report.py new file mode 100755 index 0000000..2d5966e --- /dev/null +++ b/project_report/report/project_consultant_custom_report.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, tools + + +class ProjectConsultantCustomReport(models.Model): + + _name = "project.consultant.custom.report" + _description = "Project Consultant Custom Analysis report" + #_order = 'project_id' + _auto = False + + project_id = fields.Many2one('project.project', string='Project', readonly=True) + parent_project = fields.Many2one('project.project', string='Parent Project', readonly=True) + partner_id = fields.Many2one('res.partner', string='Client', readonly=True) + employee_id = fields.Many2one('hr.employee', string='Consultant', readonly=True) + start_date = fields.Date(string='Start Date', readonly=True) + end_date = fields.Date(string='End Date', readonly=True) + percentage = fields.Float("Budgeted Percentage (%)") + budgeted_hours = fields.Float("Budgeted Hours for period", compute='_compute_budgeted_hours', store=True) + actual_percentage = fields.Float("Actual Percentage (%)", compute='_compute_actual_calc', store=True) + actual_hours = fields.Float("Actual Hours for period", compute='_compute_actual_calc', store=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, + project_id, + parentproject as parent_project, + employee_id, + partner_id, + start_date, + end_date, + percentage, + budgeted_hours, + actual_percentage, + actual_hours + from ( + select pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + consult.employee_id AS employee_id, + consult.start_date as start_date, + consult.end_date as end_date, + consult.percentage percentage, + consult.budgeted_hours AS budgeted_hours, + consult.percentage AS actual_percentage, + consult.actual_percentage AS actual_hours + FROM project_project PRO + right JOIN project_consultant_hrs consult ON PRO.id = consult.project_id + WHERE PRO.active = 't' and PRO.pricing_type='employee_rate' and PRO.project_type='hours_in_consultant' + ) res + )""" % (self._table,)) + + diff --git a/project_report/report/project_consultant_custom_report_views.xml b/project_report/report/project_consultant_custom_report_views.xml new file mode 100755 index 0000000..282b051 --- /dev/null +++ b/project_report/report/project_consultant_custom_report_views.xml @@ -0,0 +1,82 @@ + + + + + project.consultant.custom.report.pivot + project.consultant.custom.report + + + + + + + + + + + + + project.consultant.custom.report.graph + project.consultant.custom.report + + + + + + + + + + + project.consultant.custom.report.tree + project.consultant.custom.report + + + + + + + + + + + + + + + + + + project.consultant.custom.report.search + project.consultant.custom.report + + + + + + + + + + + + + + + + + + Consultant Allocation Reports + project.consultant.custom.report + pivot,tree,graph + + {'search_default_group_project': 1,'search_default_group_employee': 1} + + + + + diff --git a/project_report/report/project_revenue_custom_report.py b/project_report/report/project_revenue_custom_report.py new file mode 100755 index 0000000..0c96ba9 --- /dev/null +++ b/project_report/report/project_revenue_custom_report.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, tools + + +class ProjectRevenueCustomReport(models.Model): + + _name = "project.revenue.custom.report" + _description = "Project Revenue Custom Analysis report" + #_order = 'project_id' + _auto = False + + project_id = fields.Many2one('project.project', string='Project', readonly=True) + parent_project = fields.Many2one('project.project', string='Parent Project', readonly=True) + partner_id = fields.Many2one('res.partner', string='Client', readonly=True) + 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) + employee_id = fields.Many2one('hr.employee', string='Consultant', readonly=True) + #start_date = fields.Date(string='Start Date', readonly=True) + #end_date = fields.Date(string='End Date', readonly=True) + timesheet_sdatetime = fields.Datetime(string='Timesheet Start Time', readonly=True) + unit_amount = fields.Float('Timesheet Hours') + timesheet_cost = fields.Float('Timesheet Cost') + profit_per = fields.Float(string='Profit Percentage', digits=(16, 2)) + profit_amt = fields.Float(string='Profit Amount', digits=(16, 2)) + pro_hourly_rate = fields.Float("Hourly Rate", group_operator="sum") + budgeted_hours = fields.Float("Budgeted Hours", digits=(16, 2), readonly=True, group_operator="sum") + budgeted_revenue = fields.Float("Budgeted Revenue", digits=(16, 2), readonly=True, group_operator="sum") + actual_revenue = fields.Float("Actual Revenue", digits=(16, 2), readonly=True, group_operator="sum") + actual_cost = fields.Float("Actual Cost", digits=(16, 2), readonly=True, group_operator="sum") + + + 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, + project_id, + parentproject as parent_project, + project_type, + employee_id, + partner_id, + budgeted_revenue, + budgeted_hours, + pro_hourly_rate, + actual_revenue, + actual_cost, + profit_amt, + profit_per, + unit_amount, + timesheet_cost, + timesheet_sdatetime + from ( + select pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + pro.project_type AS project_type, + AAL.employee_id AS employee_id, + 0.0 AS budgeted_revenue, + 0.0 AS budgeted_hours, + 0.0 AS pro_hourly_rate, + 0.0 AS actual_revenue, + (AAL.amount * -1) AS actual_cost, + 0.0 AS profit_amt, + 0.0 AS profit_per, + AAL.unit_amount, + ((AAL.amount * -1)/NULLIF(AAL.unit_amount, 0)) as timesheet_cost, + AAL.start_datetime AS timesheet_sdatetime + FROM project_project PRO + RIGHT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id + RIGHT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id + WHERE PRO.active = 't' and PRO.pricing_type = 'fixed_rate' + UNION + select + pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + pro.project_type AS project_type, + null::int AS employee_id, + pro.budgeted_revenue AS budgeted_revenue, + pro.budgeted_hours2 AS budgeted_hours, + pro.hourly_rate AS pro_hourly_rate, + 0.0 AS actual_revenue, + 0.0 AS actual_cost, + pro.profit_per, + pro.profit_amt, + 0.0 as unit_amount, + 0.0 as timesheet_cost, + null::timestamp as timesheet_sdatetime + FROM project_project PRO + WHERE PRO.active = 't' and PRO.pricing_type = 'employee_rate' and PRO.project_type='hours_no_limit' + UNION + select + pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + pro.project_type AS project_type, + AAL.employee_id AS employee_id, + 0.0 AS budgeted_revenue, + 0.0 AS budgeted_hours, + 0.0 AS pro_hourly_rate, + (AAL.unit_amount * pro.hourly_rate) AS actual_revenue, + (AAL.amount * -1) AS actual_cost, + 0.0 AS profit_per, + 0.0 AS profit_amt, + AAL.unit_amount, + ((AAL.amount * -1)/NULLIF(AAL.unit_amount, 0)) as timesheet_cost, + AAL.start_datetime AS timesheet_sdatetime + FROM project_project PRO + LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id + LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id + WHERE PRO.active = 't' and PRO.pricing_type = 'employee_rate' and PRO.project_type='hours_no_limit' + UNION + select + pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + pro.project_type AS project_type, + pro_emp.employee_id AS employee_id, + pro_emp.cost AS budgeted_revenue, + pro_emp.budgeted_qty AS budgeted_hours, + 0.0 as pro_hourly_rate, + 0.0 AS actual_revenue, + 0.0 AS actual_cost, + 0.0 as profit_per, + 0.0 as profit_amt, + 0.0 as unit_amount, + 0.0 as timesheet_cost, + null::timestamp as timesheet_sdatetime + FROM project_project PRO + Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id + LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id + LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id and AAL.employee_id = pro_emp.employee_id + WHERE PRO.active = 't' and PRO.pricing_type='employee_rate' and PRO.project_type='hours_in_consultant' + UNION + select + pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + pro.project_type AS project_type, + null::int AS employee_id, + 0.0 as pro_hourly_rate, + 0.0 AS budgeted_revenue, + 0.0 AS budgeted_hours, + 0.0 AS actual_revenue, + 0.0 AS actual_cost, + pro.profit_per, + pro.profit_amt, + 0.0 as unit_amount, + 0.0 as timesheet_cost, + null::timestamp as timesheet_sdatetime + FROM project_project PRO + WHERE PRO.active = 't' and PRO.pricing_type='employee_rate' and PRO.project_type='hours_in_consultant' + UNION + select + pro.id AS project_id, + (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject, + pro.partner_id AS partner_id, + pro.project_type AS project_type, + AAL.employee_id AS employee_id, + COALESCE(pro_emp.price_unit, 0) as pro_hourly_rate, + 0.0 AS budgeted_revenue, + 0.0 AS budgeted_hours, + (AAL.unit_amount * pro_emp.price_unit) AS actual_revenue, + case when pro_emp.employee_price is null then (AAL.amount * -1) else (AAL.unit_amount * pro_emp.employee_price) end as actual_cost, + 0.0 AS profit_per, + 0.0 AS profit_amt, + AAL.unit_amount, + case when pro_emp.employee_price is null then ((AAL.amount * -1)/NULLIF(AAL.unit_amount, 0)) else pro_emp.employee_price end as timesheet_cost, + AAL.start_datetime AS timesheet_sdatetime + FROM project_project PRO + LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id + LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id + Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id and AAL.employee_id = pro_emp.employee_id + LEFT JOIN hr_employee EMP ON AAL.employee_id = EMP.id + WHERE PRO.active = 't' and PRO.pricing_type='employee_rate' and PRO.project_type='hours_in_consultant' + ) res + )""" % (self._table,)) + + diff --git a/project_report/report/project_revenue_custom_report_views.xml b/project_report/report/project_revenue_custom_report_views.xml new file mode 100755 index 0000000..2c140d6 --- /dev/null +++ b/project_report/report/project_revenue_custom_report_views.xml @@ -0,0 +1,94 @@ + + + + + project.revenue.custom.report.pivot + project.revenue.custom.report + + + + + + + + + + + + + + + + + + project.revenue.custom.report.graph + project.revenue.custom.report + + + + + + + + + + + + project.revenue.custom.report.tree + project.revenue.custom.report + + + + + + + + + + + + + + + + + + + + + project.revenue.custom.report.search + project.revenue.custom.report + + + + + + + + + + + + + + + + + + + + + Projects Revenue + project.revenue.custom.report + pivot,tree,graph + + {'search_default_group_project': 1,'search_default_group_employee': 1,'search_default_group_t_starttime': 1} + + + + + diff --git a/project_report/security/ir.model.access.csv b/project_report/security/ir.model.access.csv index d29c722..4969da6 100755 --- a/project_report/security/ir.model.access.csv +++ b/project_report/security/ir.model.access.csv @@ -8,4 +8,8 @@ access_project_create_expense_user,access_project_create_expense_project_user,mo access_project_timeline_report_manager,project.timeline.report,model_project_timeline_report,project.group_project_manager,1,1,1,1 access_project_timeline_report_user,project.timeline.report,model_project_timeline_report,project.group_project_user,1,0,0,0 access_project_timesheet_report_manager,project.timesheet.report,model_project_timesheet_report,project.group_project_manager,1,1,1,1 -access_project_timesheet_report_user,project.timesheet.report,model_project_timesheet_report,project.group_project_user,1,0,0,0 \ No newline at end of file +access_project_timesheet_report_user,project.timesheet.report,model_project_timesheet_report,project.group_project_user,1,0,0,0 +access_project_revenue_custom_report_manager,project_revenue_custom_report_manager,model_project_revenue_custom_report,project.group_project_manager,1,1,1,1 +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