diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index f00fe0c..0a644f0 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from odoo import api, fields, models, _ +from odoo.exceptions import UserError, AccessError, ValidationError class Project(models.Model): @@ -53,9 +54,30 @@ class Project(models.Model): budgeted_hour_week = fields.Float("Budgeted Hours(per week)", compute='onchange_compute_values', store=True) profit_amt = fields.Float(string='Profit Amount', digits=(16, 2), compute='_compute_calc', store=True) profit_per = fields.Float(string='Porfit Percentage', digits=(16, 2), compute='_compute_calc', store=True) + hour_distribution = fields.Selection([ + ('Manual', 'Manual'), + ('Percentage', 'Percentage'), + ], string="Hours Distribution", default="Manual") + manager_per = fields.Float(string='Manager Percentage', digits=(16, 2)) + employee_per = fields.Float(string='Employee Percentage', digits=(16, 2), compute='compute_percentage_hours', store=True) + + manager_hour = fields.Float(string='Manager Hour') + employee_hour = fields.Float(string='Employee Hour') + + @api.depends('manager_per', 'hour_distribution') + def compute_percentage_hours(self): + for record in self: + if record.manager_per > 100: + raise ValidationError(_("Percentage should be less than or equal to 100")) + if record.manager_per > 0.0: + record.employee_per = 100 - record.manager_per + # if self.manager_per > 100: + # raise ValidationError(_("Percentage should be less than or equal to 100")) _sql_constraints = [ - ('end_date_greater', 'check(end_date >= start_date)', 'Error ! Ending Date cannot be set before Beginning Date.') + ( + 'end_date_greater', 'check(end_date >= start_date)', + 'Error ! Ending Date cannot be set before Beginning Date.') ] @api.onchange('budgeted_revenue', 'expenses_per') @@ -67,7 +89,7 @@ class Project(models.Model): @api.depends('cost', 'expenses_amt', 'budgeted_revenue') def _compute_calc(self): for record in self: - total_exp = record.consultant_cost + record.expenses_amt + total_exp = record.consultant_cost + record.expenses_amt record.total_expenses = total_exp profit_amt = record.budgeted_revenue - total_exp record.profit_amt = profit_amt @@ -77,25 +99,26 @@ class Project(models.Model): @api.depends('sale_line_employee_ids', 'hourly_rate2', 'budgeted_hours') def onchange_compute_values(self): for record in self: + hour = 0.0 + cost = 0.0 + consultant_cost = 0.0 + budgeted_hour_week = 0.0 + for rec in record.sale_line_employee_ids: + hour = hour + rec.budgeted_qty + consultant_cost = consultant_cost + rec.consultant_cost + cost = cost + rec.cost + budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week if record.project_type == 'hours_in_consultant': - hour = 0.0 - cost = 0.0 - consultant_cost = 0.0 - budgeted_hour_week = 0.0 - for rec in record.sale_line_employee_ids: - hour = hour + rec.budgeted_qty - cost = cost + rec.cost - consultant_cost = consultant_cost + rec.consultant_cost - budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week - record.budgeted_hours = hour record.cost = cost - record.consultant_cost = consultant_cost - if hour > 0.0: - record.hourly_rate = (cost/hour) - record.budgeted_hour_week = budgeted_hour_week + record.budgeted_hours = hour + else: + record.cost = record.budgeted_hours * record.hourly_rate2 + record.consultant_cost = consultant_cost + if hour > 0.0: + record.hourly_rate = (cost / hour) + record.budgeted_hour_week = budgeted_hour_week + - if record.project_type == 'hours_no_limit': - record.consultant_cost = record.budgeted_hours * record.hourly_rate2 # price_unit = 0.0 # count = 0.0 # for rec in record.sale_line_employee_ids: @@ -107,7 +130,6 @@ class Project(models.Model): # record.hourly_rate = (price_unit * avg)/record.budgeted_hours - class InheritProjectProductEmployeeMap(models.Model): _inherit = 'project.sale.line.employee.map' @@ -117,13 +139,17 @@ class InheritProjectProductEmployeeMap(models.Model): timesheet_hour = fields.Float("Timesheet Hour", compute='_compute_timesheet_hour', default=0.0) employee_price = fields.Monetary(string="Consultant Price", related="employee_id.timesheet_cost", readonly=True) budgeted_hour_week = fields.Float("Budgeted Hours per week", compute='_compute_budgeted_hour_week') - price_unit = fields.Float("Hourly rate") + price_unit = fields.Float("Hourly Rate") currency_id = fields.Many2one('res.currency', string="Currency", compute='_compute_price_unit', store=True, readonly=False) sale_line_id = fields.Many2one('sale.order.line', "Service", domain=[('is_service', '=', True)]) - cost = fields.Float("Cost", compute='_compute_total_cost') - consultant_cost = fields.Float("Cost", compute='_compute_total_cost') - total = fields.Float("Total") + cost = fields.Float("Timesheet Cost", compute='_compute_total_cost', default=0.0, store=True) + consultant_cost = fields.Float("Total", compute='_compute_total_cost') + + hour_distribution = fields.Selection(related='project_id.hour_distribution') + role = fields.Selection([('Manager', 'Manager'), + ('Employee', 'Employee'), ], string=" ", default="Employee") + distribution_per = fields.Float("%") def _compute_timesheet_hour(self): for val in self: @@ -146,7 +172,16 @@ class InheritProjectProductEmployeeMap(models.Model): def _compute_total_cost(self): for val in self: - val.cost = val.budgeted_qty * val.price_unit + if val.project_id.project_type == 'hours_in_consultant': + if val.hour_distribution == 'Percentage': + if val.role == 'Manager': + val.cost = val.project_id.budgeted_revenue * (val.project_id.manager_per/100) * (val.distribution_per/100) + else: + val.cost = val.project_id.budgeted_revenue * (val.project_id.employee_per/100) * (val.distribution_per/100) + val.budgeted_qty = val.cost/val.price_unit + else: + val.cost = 0.0 + #val.cost = val.budgeted_qty * val.price_unit val.consultant_cost = val.timesheet_hour * val.employee_price @api.depends('sale_line_id', 'sale_line_id.price_unit', 'timesheet_product_id') @@ -159,5 +194,5 @@ class InheritProjectProductEmployeeMap(models.Model): line.price_unit = line.timesheet_product_id.lst_price line.currency_id = line.timesheet_product_id.currency_id else: - #line.price_unit = 0 + # line.price_unit = 0 line.currency_id = False diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 49bb694..e88a31e 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -17,6 +17,8 @@ + + @@ -39,10 +41,12 @@ widget="radio"/> - - + + +
+ + +