45 lines
1.9 KiB
Python
45 lines
1.9 KiB
Python
from odoo import models, fields, api, _
|
|
|
|
|
|
class ProjectPortfolio(models.Model):
|
|
_inherit = 'project.portfolio'
|
|
|
|
def get_portfolio_projects(self):
|
|
"""Return portfolio projects data for dashboard"""
|
|
self.ensure_one()
|
|
projects = []
|
|
for project in self.project_ids.filtered(lambda p: p.active):
|
|
projects.append({
|
|
'id': project.id,
|
|
'name': project.name,
|
|
'estimated_amount': project.estimated_amount,
|
|
'project_cost': project.project_cost,
|
|
'actual_cost': project.actual_cost,
|
|
'profit': project.profit,
|
|
'loss': project.loss,
|
|
'budget_variance_percent': (
|
|
(project.estimated_amount - project.actual_cost) / project.estimated_amount * 100)
|
|
if project.estimated_amount else 0,
|
|
'active': project.active,
|
|
})
|
|
return projects
|
|
|
|
def get_employee_performance(self):
|
|
"""Return employee performance data for dashboard"""
|
|
self.ensure_one()
|
|
performance = []
|
|
for perf in self.employee_performance_ids:
|
|
performance.append({
|
|
'id': perf.id,
|
|
'employee_id': perf.employee_id.id,
|
|
'employee_name': perf.employee_id.name,
|
|
'department_id': perf.department_id.id if perf.department_id else False,
|
|
'department_name': perf.department_id.name if perf.department_id else '',
|
|
'total_estimated_hours': perf.total_estimated_hours,
|
|
'total_actual_hours': perf.total_actual_hours,
|
|
'time_variance_percent': perf.time_variance_percent,
|
|
'on_time_completion_rate': perf.on_time_completion_rate,
|
|
'efficiency_rate': perf.efficiency_rate,
|
|
'performance_status': perf.performance_status,
|
|
})
|
|
return performance |