From 163bec94a1787b9d300b942f718940f77be7abab Mon Sep 17 00:00:00 2001 From: root Date: Thu, 18 Aug 2022 18:39:44 +0530 Subject: [PATCH] Updated Resource allocation wizard to add value and onchange calc --- cor_custom/models/project.py | 25 +++---- cor_custom/wizard/project_resource_wizard.py | 66 ++++++++++++++++--- cor_custom/wizard/project_resource_wizard.xml | 13 +++- 3 files changed, 81 insertions(+), 23 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 7809738..4c270d6 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -329,18 +329,19 @@ class InheritProjectProductEmployeeMap(models.Model): @api.constrains('start_date', 'end_date') def _check_dates(self): for val in self: - if val.end_date < val.start_date: - raise ValidationError(_('Start date must be earlier than end date.')) - domain = [ - ('start_date', '<=', val.end_date), - ('end_date', '>=', val.start_date), - ('project_id', '=', val.project_id.id), - ('employee_id', '=', val.employee_id.id), - ('id', '!=', val.id) - ] - res = self.search_count(domain) - if res > 0: - raise ValidationError(_('Same Consultant can not have 2 same date that overlaps on same day!')) + if val.end_date and val.start_date: + if val.end_date < val.start_date: + raise ValidationError(_('Start date must be earlier than end date.')) + domain = [ + ('start_date', '<=', val.end_date), + ('end_date', '>=', val.start_date), + ('project_id', '=', val.project_id.id), + ('employee_id', '=', val.employee_id.id), + ('id', '!=', val.id) + ] + res = self.search_count(domain) + if res > 0: + raise ValidationError(_('Same Consultant can not have 2 same date that overlaps on same day!')) @api.onchange('employee_id') def onchange_employee_price(self): diff --git a/cor_custom/wizard/project_resource_wizard.py b/cor_custom/wizard/project_resource_wizard.py index 3530362..337d6fc 100755 --- a/cor_custom/wizard/project_resource_wizard.py +++ b/cor_custom/wizard/project_resource_wizard.py @@ -7,21 +7,44 @@ from dateutil import relativedelta class ProjectResourceWizard(models.TransientModel): _name = 'project.resource.wizard' + @api.model + def default_get(self, fields): + res = super(ProjectResourceWizard, self).default_get(fields) + res_id = self._context.get('active_id') + record = self.env['project.project'].browse(res_id) + lines = [] + emp_id = [] + for rec in record.sale_line_employee_ids: + resource_rec = {} + if rec.employee_id and rec.employee_id.id not in emp_id: + emp_id.append(rec.employee_id.id) + resource_rec.update({'employee_id':rec.employee_id.id, 'project_id': res_id}) + lines.append((0, 0, resource_rec)) + res.update({'add_project_resource': lines}) + return res + project_id = fields.Many2one('project.project') add_project_resource = fields.One2many('project.resource.line', 'wizard_id') def action_add_project_lines(self): - print('11111111111', self.project_id, self.project_id.sale_line_employee_ids) - for record in self.add_project_resource: + record = self.env['project.sale.line.employee.map'] + for val in self.add_project_resource: values = { - 'project_id':record.project_id.id, - 'employee_id': record.employee_id.id, - 'start_date':record.start_date, - 'end_date':record.end_date, + 'project_id': self.project_id.id, + 'employee_id': val.employee_id.id, + 'role': val.role, + 'start_date': val.start_date, + 'end_date': val.end_date, + 'price_unit': val.price_unit, + 'budgeted_qty': val.budgeted_qty, + 'cost': val.cost, + 'employee_price': val.employee_price, } - res = self.project_id.sale_line_employee_ids.create(values) - return res + if self.project_id.hour_distribution == 'Percentage': + values.update({'distribution_per': val.distribution_per}) + record.create(values) + return True class ProjectResourceLine(models.Model): _name = "project.resource.line" @@ -30,5 +53,32 @@ class ProjectResourceLine(models.Model): wizard_id = fields.Integer() project_id = fields.Many2one('project.project') employee_id = fields.Many2one('hr.employee') + role = fields.Selection([('Manager', 'Manager'),('Employee', 'Employee'), ], string="Role", default="Employee") start_date = fields.Date(required=True) end_date = fields.Date(required=True) + price_unit = fields.Float("Hourly Rate") + budgeted_qty = fields.Float(string='Bud. Hours', digits=(16, 2)) + cost = fields.Float("Bud. Revenue", default=0.0) + employee_price = fields.Float(string="Cons. Price") + hour_distribution = fields.Selection(related='project_id.hour_distribution') + distribution_per = fields.Float("%") + + @api.onchange('employee_id') + def onchange_employee_price(self): + if self.employee_id: + self.employee_price = self.employee_id.timesheet_cost + else: + self.employee_price = 0.0 + + @api.onchange('price_unit', 'budgeted_qty') + def _calculate_total_cost(self): + #if self.env.context.get('active_model') == 'project.project' and self.env.context.get('active_id'): + #pro = self.env['project.project'].browse(self.env.context.get('active_id')) + if self.project_id.project_type == 'hours_in_consultant': + if self.hour_distribution == 'Manual': + self.cost = self.price_unit * self.budgeted_qty + + @api.onchange('start_date') + def onchange_start_date(self): + if self.start_date: + self.end_date = self.start_date + relativedelta.relativedelta(months=1) - relativedelta.relativedelta(days=1) diff --git a/cor_custom/wizard/project_resource_wizard.xml b/cor_custom/wizard/project_resource_wizard.xml index e3e7de0..b7243cc 100755 --- a/cor_custom/wizard/project_resource_wizard.xml +++ b/cor_custom/wizard/project_resource_wizard.xml @@ -8,12 +8,19 @@ - + - + + + + + + + + @@ -30,6 +37,6 @@ project.resource.wizard new - { 'default_project_id': active_id, 'project_id': active_id } + { 'default_project_id':active_id, 'project_id': active_id} \ No newline at end of file