From 2b4226b422a70eb5301943d75bcd7dcb3b7cfea3 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jan 2021 13:33:46 +0530 Subject: [PATCH 001/182] update code without division --- cor_custom/models/project.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 6fe9cbd..2f5e405 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -82,6 +82,21 @@ class Project(models.Model): record.hourly_rate = (cost/val) record.budgeted_hour_week = budgeted_hour_week + if record.project_type == 'hours_no_limit': + price_unit = 0.0 + count = 0.0 + for rec in record.sale_line_employee_ids: + price_unit = price_unit + rec.price_unit + count = count + 1 + print('price_unit', price_unit, count) + if record.budgeted_hours > 0.0: + avg =(record.budgeted_hours/count) + hourly_rate = price_unit * avg + print('ppppppppppp', avg, hourly_rate) + record.hourly_rate = (price_unit * avg)/record.budgeted_hours + print('100000', record.hourly_rate) + + class InheritProjectProductEmployeeMap(models.Model): _inherit = 'project.sale.line.employee.map' From b563d1d9d416e730cf6a4311990319b4433da287 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jan 2021 19:00:49 +0530 Subject: [PATCH 002/182] made field changes --- cor_custom/models/project.py | 14 ++++++++++++-- cor_custom/views/project_view.xml | 8 +++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 2f5e405..591bae7 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -48,6 +48,10 @@ class Project(models.Model): total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', 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) + consultant_cost = fields.Float("Sum of Cost", compute='onchange_compute_values', store=True) + total_cost = fields.Float("Cost") + total_hourly_rate = fields.Float("Cost") + total_budgeted_hour_week = fields.Float("Cost") @api.onchange('budgeted_revenue', 'expenses_per') def onchange_expenses_per(self): @@ -71,13 +75,16 @@ class Project(models.Model): if record.project_type == 'hours_in_consultant': val = 0.0 cost = 0.0 + consultant_cost = 0.0 budgeted_hour_week = 0.0 for rec in record.sale_line_employee_ids: val = val + 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 = val record.cost = cost + record.consultant_cost = cost if val > 0.0: record.hourly_rate = (cost/val) record.budgeted_hour_week = budgeted_hour_week @@ -89,7 +96,7 @@ class Project(models.Model): price_unit = price_unit + rec.price_unit count = count + 1 print('price_unit', price_unit, count) - if record.budgeted_hours > 0.0: + if record.budgeted_hours > 0.0 and count > 0.0: avg =(record.budgeted_hours/count) hourly_rate = price_unit * avg print('ppppppppppp', avg, hourly_rate) @@ -101,17 +108,19 @@ class Project(models.Model): class InheritProjectProductEmployeeMap(models.Model): _inherit = 'project.sale.line.employee.map' - employee_price = fields.Monetary(string="Consultant Price", related="employee_id.timesheet_cost", readonly=True) budgeted_qty = fields.Float(string='Budgeted Hours', store=True) budgeted_uom = fields.Many2one('uom.uom', string='Budgeted UOM', related='sale_line_id.product_uom', readonly=True) # budgeted_uom = fields.Many2one('uom.uom', string='Budgeted UOM', related='timesheet_product_id.uom_id', readonly=True) 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") 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") def _compute_timesheet_hour(self): for val in self: @@ -135,6 +144,7 @@ class InheritProjectProductEmployeeMap(models.Model): def _compute_total_cost(self): for val in self: 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') def _compute_price_unit(self): diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 5835b26..2ea00ad 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -74,15 +74,16 @@ - - - + + + + @@ -96,6 +97,7 @@ + From a77bc836c8ccf91580c1bd25b159479d75763127 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jan 2021 19:02:52 +0530 Subject: [PATCH 003/182] made field changes --- cor_custom/models/project.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 591bae7..22170af 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -49,9 +49,6 @@ class Project(models.Model): 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) consultant_cost = fields.Float("Sum of Cost", compute='onchange_compute_values', store=True) - total_cost = fields.Float("Cost") - total_hourly_rate = fields.Float("Cost") - total_budgeted_hour_week = fields.Float("Cost") @api.onchange('budgeted_revenue', 'expenses_per') def onchange_expenses_per(self): From 21b2edc61d38e7de4dcdff855c855bfc6b60d375 Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Mon, 4 Jan 2021 22:21:58 +0530 Subject: [PATCH 004/182] Start and end time added --- cor_custom/models/project.py | 7 +++++++ cor_custom/views/project_view.xml | 2 ++ project_report/report/project_budget_hrs_analysis.py | 2 ++ 3 files changed, 11 insertions(+) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 22170af..cf101e6 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -38,6 +38,8 @@ class Project(models.Model): " them or by someone of their company.") allow_billable = fields.Boolean("Billable", default=True, help="Invoice your time and material from tasks.") + start_date = fields.Date(string='Start Date') + end_date = fields.Date(string='End Date') budgeted_hours = fields.Float(string='Total Budgeted Hours', digits=(16, 2)) budgeted_revenue = fields.Float(string='Budgeted Revenue', digits=(16, 2)) expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) @@ -50,6 +52,11 @@ class Project(models.Model): profit_per = fields.Float(string='Porfit Percentage', digits=(16, 2), compute='_compute_calc', store=True) consultant_cost = fields.Float("Sum of Cost", compute='onchange_compute_values', store=True) + + _sql_constraints = [ + ('end_date_greater', 'check(end_date >= start_date)', 'Error ! Ending Date cannot be set before Beginning Date.') + ] + @api.onchange('budgeted_revenue', 'expenses_per') def onchange_expenses_per(self): if self.budgeted_revenue > 0 and self.expenses_per > 0: diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 2ea00ad..2c11fdc 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -39,6 +39,8 @@ widget="radio"/> + + diff --git a/project_report/report/project_budget_hrs_analysis.py b/project_report/report/project_budget_hrs_analysis.py index b2ade6e..d24aa80 100755 --- a/project_report/report/project_budget_hrs_analysis.py +++ b/project_report/report/project_budget_hrs_analysis.py @@ -32,6 +32,8 @@ class BudgetHrsAnalysis(models.Model): Pro_emp.employee_id AS employee_id, 'Budgeted Hours' as hours_type, CASE + --WHEN Pro.project_type='hours_no_limit' THEN Pro.budgeted_hours + --WHEN Pro.project_type='hours_in_consultant' and Pro_emp.id is not null THEN Pro_emp.budgeted_qty WHEN Pro_emp.id is null THEN Pro.budgeted_hours ELSE Pro_emp.budgeted_qty END AS hours From 39a0a6cf8a1b5eac577d10312808a7737b3a6f00 Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Tue, 5 Jan 2021 17:02:04 +0530 Subject: [PATCH 005/182] Report updated --- .../report/project_budget_amt_analysis.py | 12 +-- .../report/project_budget_hrs_analysis.py | 101 ++++++++++++------ 2 files changed, 72 insertions(+), 41 deletions(-) diff --git a/project_report/report/project_budget_amt_analysis.py b/project_report/report/project_budget_amt_analysis.py index 078e7f1..898478f 100755 --- a/project_report/report/project_budget_amt_analysis.py +++ b/project_report/report/project_budget_amt_analysis.py @@ -25,18 +25,18 @@ class BudgetAmtAnalysis(models.Model): tools.drop_view_if_exists(self._cr, self._table) self._cr.execute(""" CREATE OR REPLACE VIEW %s AS ( - SELECT + SELECT ROW_NUMBER() OVER() as id, project_id, partner_id, amount_type, revenue from ( + SELECT row_number() OVER() AS id, PRO.id AS project_id, PRO.create_date AS create_date, PRO.partner_id AS partner_id, 'Budgeted Revenue' as amount_type, PRO.budgeted_revenue AS revenue - --SO.amount_total AS actual_revenue FROM project_project PRO LEFT JOIN sale_order SO ON PRO.sale_order_id = SO.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 + --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!='fixed_rate' group by Pro.id, PRO.partner_id, Pro.budgeted_revenue, so.amount_total union @@ -46,14 +46,14 @@ class BudgetAmtAnalysis(models.Model): PRO.create_date AS create_date, PRO.partner_id AS partner_id, 'Actual Revenue' as amount_type, - SO.amount_total AS revenue + sum(AAL.amount * -1) + pro.total_expenses AS revenue FROM project_project PRO LEFT JOIN sale_order SO ON PRO.sale_order_id = SO.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 WHERE PRO.active = 't' and PRO.pricing_type!='fixed_rate' group by Pro.id, PRO.partner_id, Pro.budgeted_revenue, so.amount_total - order by create_date desc, project_id, amount_type desc + order by create_date desc, project_id, amount_type desc) as res )""" % (self._table,)) diff --git a/project_report/report/project_budget_hrs_analysis.py b/project_report/report/project_budget_hrs_analysis.py index d24aa80..1409d0a 100755 --- a/project_report/report/project_budget_hrs_analysis.py +++ b/project_report/report/project_budget_hrs_analysis.py @@ -15,8 +15,9 @@ class BudgetHrsAnalysis(models.Model): project_id = fields.Many2one('project.project', string='Project', readonly=True) partner_id = fields.Many2one('res.partner', string='Client', readonly=True) employee_id = fields.Many2one('hr.employee', string='Employee', readonly=True) - hours_type = fields.Char(string="Hours Type") + hours_type = fields.Char(string="Hours Type", readonly=True) hours = fields.Float("Hours", digits=(16, 2), readonly=True, group_operator="sum") + #budgeted_hours = fields.Float("Budgeted Hours", digits=(16, 2), readonly=True, group_operator="sum") #actual_hours = fields.Float("Actual Hours", digits=(16, 2), readonly=True, group_operator="sum") @@ -25,41 +26,71 @@ class BudgetHrsAnalysis(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, - PRO.id AS project_id, - PRO.create_date AS create_date, - PRO.partner_id AS partner_id, - Pro_emp.employee_id AS employee_id, - 'Budgeted Hours' as hours_type, - CASE - --WHEN Pro.project_type='hours_no_limit' THEN Pro.budgeted_hours - --WHEN Pro.project_type='hours_in_consultant' and Pro_emp.id is not null THEN Pro_emp.budgeted_qty - WHEN Pro_emp.id is null THEN Pro.budgeted_hours - ELSE Pro_emp.budgeted_qty - END AS hours - 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!='fixed_rate' - group by Pro.id, Pro_emp.id, PRO.partner_id, Pro_emp.employee_id, AAL.unit_amount + SELECT ROW_NUMBER() OVER() as id, project_id, partner_id, employee_id, hours_type, hours from ( + SELECT + PRO.id AS project_id, + PRO.create_date AS create_date, + PRO.partner_id AS partner_id, + null AS employee_id, + 'Budgeted Hours' as hours_type, + PRO.budgeted_hours AS hours + 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 != 'fixed_rate' + and PRO.project_type = 'hours_no_limit' Union - SELECT row_number() OVER() AS id, - PRO.id AS project_id, - PRO.create_date AS create_date, - PRO.partner_id AS partner_id, - Pro_emp.employee_id AS employee_id, - 'Actual Hours' as hours_type, - sum(AAL.unit_amount) AS hours - 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!='fixed_rate' - group by Pro.id, Pro_emp.id, PRO.partner_id, Pro_emp.employee_id, AAL.unit_amount - order by create_date desc, project_id, employee_id, hours_type desc + SELECT + PRO.id AS project_id, + PRO.create_date AS create_date, + PRO.partner_id AS partner_id, + Pro_emp.employee_id AS employee_id, + 'Budgeted Hours' as hours_type, + Pro_emp.budgeted_qty as hours + 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 + Where + PRO.active = 't' + and PRO.pricing_type != 'fixed_rate' + and PRO.project_type = 'hours_in_consultant' + Union + SELECT + PRO.id AS project_id, + PRO.create_date AS create_date, + PRO.partner_id AS partner_id, + AAL.employee_id AS employee_id, + 'Actual Hours' as hours_type, + sum(AAL.unit_amount) AS hours + 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 != 'fixed_rate' + group by + Pro.id, + --Pro_emp.id, + --PRO.partner_id, + AAL.employee_id, + AAL.unit_amount, + hours_type + ) as res + order by + project_id desc, + hours_type asc, + employee_id )""" % (self._table,)) From 2724396c459c5bfb35cc0fb94a854eb95abc7b94 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Tue, 5 Jan 2021 17:49:56 +0530 Subject: [PATCH 006/182] changes in calculation for revenue --- cor_custom/models/project.py | 23 +++++++++++++---------- cor_custom/views/project_view.xml | 12 +++++++----- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 22170af..44ec02f 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -42,13 +42,15 @@ class Project(models.Model): budgeted_revenue = fields.Float(string='Budgeted Revenue', digits=(16, 2)) expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) - cost = fields.Float("Sum of Cost", compute='onchange_compute_values', store=True) + cost = fields.Float("Total Revenue", compute='onchange_compute_values', store=True) + consultant_cost = fields.Float("Consultant Cost", compute='onchange_compute_values', store=True) + other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') + total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) hourly_rate = fields.Float("Sum of Hourly rate", compute='onchange_compute_values', store=True) budgeted_hour_week = fields.Float("Budgeted Hours(per week)", compute='onchange_compute_values', store=True) - total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', 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) - consultant_cost = fields.Float("Sum of Cost", compute='onchange_compute_values', store=True) + @api.onchange('budgeted_revenue', 'expenses_per') def onchange_expenses_per(self): @@ -59,7 +61,7 @@ class Project(models.Model): @api.depends('cost', 'expenses_amt', 'budgeted_revenue') def _compute_calc(self): for record in self: - total_exp = record.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 @@ -70,20 +72,21 @@ class Project(models.Model): def onchange_compute_values(self): for record in self: if record.project_type == 'hours_in_consultant': - val = 0.0 + hour = 0.0 cost = 0.0 consultant_cost = 0.0 budgeted_hour_week = 0.0 for rec in record.sale_line_employee_ids: - val = val + rec.budgeted_qty + 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 = val + record.budgeted_hours = hour record.cost = cost - record.consultant_cost = cost - if val > 0.0: - record.hourly_rate = (cost/val) + print('kkkkkkkkkkkkk', consultant_cost) + 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': diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 2ea00ad..c998706 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -88,19 +88,21 @@ - + + + - - + + From 10c8c9bd23e53b257541ee28b66543b0a16b946f Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Wed, 6 Jan 2021 10:55:21 +0530 Subject: [PATCH 007/182] Export data and budgeted hours forecast added --- cor_custom/models/analytic.py | 35 ++++++++++++++++++++- project_forecast/models/project_forecast.py | 18 ++++++++++- project_forecast/views/planning_views.xml | 1 + 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/cor_custom/models/analytic.py b/cor_custom/models/analytic.py index efb1be5..8d4c801 100755 --- a/cor_custom/models/analytic.py +++ b/cor_custom/models/analytic.py @@ -1,9 +1,13 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details -from odoo import api, exceptions, fields, models, _ +from odoo import api, exceptions, fields, models, tools, _ from odoo.exceptions import UserError, AccessError, ValidationError from odoo.osv import expression +import math +from datetime import datetime, time, timedelta +from odoo.tools.float_utils import float_round +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, ustr class AccountAnalyticLine(models.Model): _inherit = 'account.analytic.line' @@ -34,6 +38,35 @@ class AccountAnalyticLine(models.Model): raise ValidationError(_("End time cannot be earlier than Start time")) self.unit_amount = res + @api.model + def export_data(self, fields): + index = range(len(fields)) + fields_name = dict(zip(fields, index)) + res = super(AccountAnalyticLine, self).export_data(fields) + for index, val in enumerate(res['datas']): + if fields_name.get('date') >=0: + tdateindex = fields_name.get('date') + tdate = res['datas'][index][tdateindex] + if tdate: + res['datas'][index][tdateindex] = datetime.strftime(tdate, "%d/%m/%Y") + if fields_name.get('task_id') >=0: + taskindex = fields_name.get('task_id') + ttask = res['datas'][index][taskindex] + if type(ttask)==bool: + res['datas'][index][taskindex] = '' + if fields_name.get('start_time') >=0: + starttimeindex = fields_name.get('start_time') + starttime = float(res['datas'][index][starttimeindex]) + if starttime: + start_time = tools.format_duration(starttime) + res['datas'][index][starttimeindex] = start_time + if fields_name.get('end_time') >=0: + endtimeindex = fields_name.get('end_time') + endtime = float(res['datas'][index][endtimeindex]) + if endtime: + end_time = tools.format_duration(endtime) + res['datas'][index][endtimeindex] = end_time + return res @api.model def create(self, vals): diff --git a/project_forecast/models/project_forecast.py b/project_forecast/models/project_forecast.py index f86a465..93d93d9 100755 --- a/project_forecast/models/project_forecast.py +++ b/project_forecast/models/project_forecast.py @@ -16,12 +16,26 @@ class PlanningShift(models.Model): _inherit = 'planning.slot' project_id = fields.Many2one('project.project', string="Project", domain="[('company_id', '=', company_id), ('allow_forecast', '=', True)]", check_company=True) + budgeted_hours = fields.Float("Budgeted hours", default=0, compute='_compute_budgeted_hours', store=True) task_id = fields.Many2one('project.task', string="Task", domain="[('company_id', '=', company_id), ('project_id', '=', project_id)]", check_company=True) _sql_constraints = [ ('project_required_if_task', "CHECK( (task_id IS NOT NULL AND project_id IS NOT NULL) OR (task_id IS NULL) )", "If the planning is linked to a task, the project must be set too."), ] + @api.depends('project_id', 'employee_id') + def _compute_budgeted_hours(self): + for slot in self: + if slot.project_id and slot.employee_id: + if slot.project_id.project_type == 'hours_no_limit': + slot.budgeted_hours = slot.project_id.budgeted_hours + #print("slot.project_id.project_type", slot.project_id.project_type) + if slot.project_id.project_type == 'hours_in_consultant': + cons = self.env['project.sale.line.employee.map'].search([('employee_id','=',slot.employee_id.id),('project_id','=',slot.project_id.id)], limit=1) + slot.budgeted_hours = cons and cons.budgeted_qty or 0 + else: + slot.budgeted_hours = 0 + @api.onchange('task_id') def _onchange_task_id(self): if not self.project_id: @@ -46,7 +60,9 @@ class PlanningShift(models.Model): project_ids = self.env['project.project'].search( [('privacy_visibility', '=', 'followers'), ('allow_forecast', '=', True), ('allowed_internal_user_ids', 'in', self.employee_id.user_id.id)]).ids - emp_all_project_ids = manager_id + emp_project_ids + project_ids + consul_ids = self.env['project.sale.line.employee.map'].search([('employee_id', '=', self.employee_id.id)]) + consul_project_ids = [val.project_id.id for val in consul_ids] + emp_all_project_ids = manager_id + emp_project_ids + project_ids + consul_project_ids domain = [('id', 'in', list(set(emp_all_project_ids)))] result = { 'domain': {'project_id': domain}, diff --git a/project_forecast/views/planning_views.xml b/project_forecast/views/planning_views.xml index 779f613..199e15c 100755 --- a/project_forecast/views/planning_views.xml +++ b/project_forecast/views/planning_views.xml @@ -21,6 +21,7 @@ + From ec53a365d78be66f85eba0fcc1ccf801061204cc Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Wed, 6 Jan 2021 11:46:48 +0530 Subject: [PATCH 008/182] List view and read group added --- project_forecast/models/project_forecast.py | 7 +++++++ project_forecast/views/planning_views.xml | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/project_forecast/models/project_forecast.py b/project_forecast/models/project_forecast.py index 93d93d9..6c61e71 100755 --- a/project_forecast/models/project_forecast.py +++ b/project_forecast/models/project_forecast.py @@ -23,6 +23,13 @@ class PlanningShift(models.Model): ('project_required_if_task', "CHECK( (task_id IS NOT NULL AND project_id IS NOT NULL) OR (task_id IS NULL) )", "If the planning is linked to a task, the project must be set too."), ] + @api.model + def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True): + if 'budgeted_hours' in fields: + fields.remove('budgeted_hours') + return super(PlanningShift, self).read_group(domain, fields, groupby, offset, limit, orderby, lazy) + + @api.depends('project_id', 'employee_id') def _compute_budgeted_hours(self): for slot in self: diff --git a/project_forecast/views/planning_views.xml b/project_forecast/views/planning_views.xml index 199e15c..9b7fce4 100755 --- a/project_forecast/views/planning_views.xml +++ b/project_forecast/views/planning_views.xml @@ -8,8 +8,9 @@ - - + + + From 44a188b2092e8e3cb7649e2f00bcd6af75f30892 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Wed, 6 Jan 2021 12:21:32 +0530 Subject: [PATCH 009/182] compute the value for project without consultant --- cor_custom/models/project.py | 30 +++++++++++++----------------- cor_custom/views/project_view.xml | 6 ++++-- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 7e1ec8f..f00fe0c 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -48,13 +48,12 @@ class Project(models.Model): consultant_cost = fields.Float("Consultant Cost", compute='onchange_compute_values', store=True) other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Sum of Hourly rate", compute='onchange_compute_values', store=True) + hourly_rate = fields.Float("Hourly rate", compute='onchange_compute_values', store=True) + hourly_rate2 = fields.Float("Hourly rate") 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) - - _sql_constraints = [ ('end_date_greater', 'check(end_date >= start_date)', 'Error ! Ending Date cannot be set before Beginning Date.') ] @@ -75,7 +74,7 @@ class Project(models.Model): if record.profit_amt > 0 and record.budgeted_revenue > 0: record.profit_per = (record.profit_amt / record.budgeted_revenue) * 100 - @api.depends('sale_line_employee_ids') + @api.depends('sale_line_employee_ids', 'hourly_rate2', 'budgeted_hours') def onchange_compute_values(self): for record in self: if record.project_type == 'hours_in_consultant': @@ -90,25 +89,22 @@ class Project(models.Model): budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week record.budgeted_hours = hour record.cost = cost - print('kkkkkkkkkkkkk', consultant_cost) 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': - price_unit = 0.0 - count = 0.0 - for rec in record.sale_line_employee_ids: - price_unit = price_unit + rec.price_unit - count = count + 1 - print('price_unit', price_unit, count) - if record.budgeted_hours > 0.0 and count > 0.0: - avg =(record.budgeted_hours/count) - hourly_rate = price_unit * avg - print('ppppppppppp', avg, hourly_rate) - record.hourly_rate = (price_unit * avg)/record.budgeted_hours - print('100000', record.hourly_rate) + record.consultant_cost = record.budgeted_hours * record.hourly_rate2 + # price_unit = 0.0 + # count = 0.0 + # for rec in record.sale_line_employee_ids: + # price_unit = price_unit + rec.price_unit + # count = count + 1 + # if record.budgeted_hours > 0.0 and count > 0.0: + # avg =(record.budgeted_hours/count) + # hourly_rate = price_unit * avg + # record.hourly_rate = (price_unit * avg)/record.budgeted_hours diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 396c38a..49bb694 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -98,11 +98,13 @@ - - + + + From bcddf6cc3c8e6b7f91bba2a4eb2c567eb1613261 Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Wed, 6 Jan 2021 17:11:40 +0530 Subject: [PATCH 010/182] project and employee forecast domain updated --- project_forecast/models/project.py | 5 +++++ project_forecast/models/project_forecast.py | 23 ++++++++++++++++++--- project_forecast/views/planning_views.xml | 10 ++++++--- project_forecast/views/project_views.xml | 6 +++--- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/project_forecast/models/project.py b/project_forecast/models/project.py index 34c0473..7860de7 100755 --- a/project_forecast/models/project.py +++ b/project_forecast/models/project.py @@ -15,6 +15,11 @@ class Project(models.Model): raise UserError(_('You cannot delete a project containing plannings. You can either delete all the project\'s forecasts and then delete the project or simply deactivate the project.')) return super(Project, self).unlink() + def action_view_project_forecast_action_from_project(self): + action = self.env["ir.actions.actions"]._for_xml_id("project_forecast.project_forecast_action_from_project") + action['context'] = {'default_project_id': self.id} + return action + class Task(models.Model): _inherit = 'project.task' diff --git a/project_forecast/models/project_forecast.py b/project_forecast/models/project_forecast.py index 6c61e71..19a0419 100755 --- a/project_forecast/models/project_forecast.py +++ b/project_forecast/models/project_forecast.py @@ -50,7 +50,7 @@ class PlanningShift(models.Model): else: self.task_id.project_id = self.project_id - @api.onchange('employee_id') + """@api.onchange('employee_id') def _onchange_employee_id(self): domain = [] if self.employee_id and not self.employee_id.user_id: @@ -74,13 +74,30 @@ class PlanningShift(models.Model): result = { 'domain': {'project_id': domain}, } - return result + return result""" @api.onchange('project_id') def _onchange_project_id(self): domain = [] if not self.project_id else [('project_id', '=', self.project_id.id)] + manager_id = [] + user_ids = [] + consul_project_ids = [] + if self.project_id: + consul_ids = self.env['project.sale.line.employee.map'].search([('project_id', '=', self.project_id.id)]) + consul_project_ids = [val.employee_id.id for val in consul_ids] + print("consul_project_ids", consul_project_ids) + if self.project_id and self.project_id.user_id: + manager_id = self.env['hr.employee'].search([('user_id', '=', self.project_id.user_id.id)]).ids + print("manager_id", manager_id) + if self.project_id and self.project_id.privacy_visibility in ('employees', 'portal'): + user_ids = self.env['hr.employee'].search([('user_id', '!=', False)]).ids + if self.project_id and self.project_id.privacy_visibility == 'followers': + print("project_all_emp_ids", self.project_id.allowed_internal_user_ids, self.project_id.allowed_internal_user_ids.ids) + user_ids = self.env['hr.employee'].search([('user_id', 'in', self.project_id.allowed_internal_user_ids.ids)]).ids + project_all_emp_ids = manager_id + user_ids + consul_project_ids + print("project_all_emp_idsproject_all_emp_ids", project_all_emp_ids, domain) result = { - 'domain': {'task_id': domain}, + 'domain': {'task_id': domain, 'employee_id': [('id', 'in', project_all_emp_ids)]}, } if self.project_id != self.task_id.project_id: # reset task when changing project diff --git a/project_forecast/views/planning_views.xml b/project_forecast/views/planning_views.xml index 9b7fce4..b7dd760 100755 --- a/project_forecast/views/planning_views.xml +++ b/project_forecast/views/planning_views.xml @@ -7,9 +7,11 @@ planning.slot - + + + @@ -20,11 +22,13 @@ planning.slot - + - + + + diff --git a/project_forecast/views/project_views.xml b/project_forecast/views/project_views.xml index 72543d6..4a7b3e3 100755 --- a/project_forecast/views/project_views.xml +++ b/project_forecast/views/project_views.xml @@ -10,7 +10,7 @@ - +
Planning
@@ -43,8 +43,8 @@
-
From 53b424fbfde3c40818cac0b00b81795c17b2489b Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Wed, 6 Jan 2021 17:14:17 +0530 Subject: [PATCH 011/182] update percentage code --- cor_custom/models/project.py | 85 ++++++++++++++++++++++--------- cor_custom/views/project_view.xml | 15 ++++-- 2 files changed, 72 insertions(+), 28 deletions(-) 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"/> - - + + +
+ + + - + + @@ -28,6 +29,7 @@ + diff --git a/project_report/report/project_budget_amt_analysis.py b/project_report/report/project_budget_amt_analysis.py index 898478f..a71caa4 100755 --- a/project_report/report/project_budget_amt_analysis.py +++ b/project_report/report/project_budget_amt_analysis.py @@ -46,7 +46,7 @@ class BudgetAmtAnalysis(models.Model): PRO.create_date AS create_date, PRO.partner_id AS partner_id, 'Actual Revenue' as amount_type, - sum(AAL.amount * -1) + pro.total_expenses AS revenue + pro.total_expenses AS revenue FROM project_project PRO LEFT JOIN sale_order SO ON PRO.sale_order_id = SO.id LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id diff --git a/project_report/report/project_budget_amt_analysis_views.xml b/project_report/report/project_budget_amt_analysis_views.xml index c5bde16..2374ae0 100755 --- a/project_report/report/project_budget_amt_analysis_views.xml +++ b/project_report/report/project_budget_amt_analysis_views.xml @@ -48,7 +48,7 @@ Projects Revenue Acutal Vs Budget project.budget.amt.report - pivot,graph + graph,pivot {'search_default_group_by_project': 1,'search_default_group_by_amount_type': 1} diff --git a/project_report/report/project_budget_hrs_analysis.py b/project_report/report/project_budget_hrs_analysis.py index a7fe224..4ca619d 100755 --- a/project_report/report/project_budget_hrs_analysis.py +++ b/project_report/report/project_budget_hrs_analysis.py @@ -14,7 +14,7 @@ class BudgetHrsAnalysis(models.Model): #analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', readonly=True) project_id = fields.Many2one('project.project', string='Project', readonly=True) partner_id = fields.Many2one('res.partner', string='Client', readonly=True) - employee_id = fields.Many2one('hr.employee', string='Employee', readonly=True) + employee_id = fields.Many2one('hr.employee', string='Consultant', readonly=True) hours_type = fields.Char(string="Hours Type", readonly=True) hours = fields.Float("Hours", digits=(16, 2), readonly=True, group_operator="sum") diff --git a/project_report/report/project_budget_hrs_analysis_views.xml b/project_report/report/project_budget_hrs_analysis_views.xml index 5b90433..23ee61b 100755 --- a/project_report/report/project_budget_hrs_analysis_views.xml +++ b/project_report/report/project_budget_hrs_analysis_views.xml @@ -48,7 +48,7 @@ Projects Hours Acutal Vs Budget project.budget.hrs.report - pivot,graph + graph,pivot {'search_default_group_by_project': 1,'search_default_group_by_hours_type': 1} From cdf16a972bb17864a08c1a93c171c6226a8de286 Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Wed, 6 Jan 2021 21:46:40 +0530 Subject: [PATCH 015/182] Rem allocated updated --- project_forecast/models/project_forecast.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/project_forecast/models/project_forecast.py b/project_forecast/models/project_forecast.py index d1071cc..c7ef3c0 100755 --- a/project_forecast/models/project_forecast.py +++ b/project_forecast/models/project_forecast.py @@ -39,19 +39,19 @@ class PlanningShift(models.Model): if slot.project_id and slot.employee_id: if slot.project_id.project_type == 'hours_no_limit': slot.budgeted_hours = slot.project_id.budgeted_hours - rec = self.search([('project_id','=',slot.project_id.id)]) + rec = slot.search([('project_id','=',slot.project_id.id)]) all_hours = 0 for r in rec: all_hours += r.allocated_hours - slot.rem_all_hours = self.budgeted_hours - all_hours + slot.rem_all_hours = slot.budgeted_hours - all_hours if slot.project_id.project_type == 'hours_in_consultant': cons = self.env['project.sale.line.employee.map'].search([('employee_id','=',slot.employee_id.id),('project_id','=',slot.project_id.id)], limit=1) slot.budgeted_hours = cons and cons.budgeted_qty or 0 - rec = self.search([('employee_id', '=', slot.employee_id.id),('project_id', '=', slot.project_id.id)]) + rec = slot.search([('employee_id', '=', slot.employee_id.id),('project_id', '=', slot.project_id.id)]) all_hours = 0 for r in rec: all_hours += r.allocated_hours - slot.rem_all_hours = self.budgeted_hours - all_hours + slot.rem_all_hours = slot.budgeted_hours - all_hours else: slot.budgeted_hours = 0 slot.rem_all_hours = 0 From 0f57a1f742b45030f4485c457adba34391890f92 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Wed, 6 Jan 2021 22:44:30 +0530 Subject: [PATCH 016/182] add feedback changes --- cor_custom/models/project.py | 25 +++++++++++++------------ cor_custom/views/project_view.xml | 8 +++----- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index cc8acce..dafe130 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -46,11 +46,10 @@ class Project(models.Model): expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) cost = fields.Float("Total Revenue", compute='onchange_compute_values', store=True) - consultant_cost = fields.Float("Consultant Cost", compute='onchange_compute_values', store=True) + consultant_cost = fields.Float("Actual Cost", compute='onchange_compute_values', store=True) other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Hourly rate", compute='onchange_compute_values', store=True) - hourly_rate2 = fields.Float("Hourly rate") + hourly_rate = fields.Float("Hourly Rate", compute='onchange_compute_values', store=True) 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) @@ -58,8 +57,8 @@ class Project(models.Model): ('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_per = fields.Float(string='Manager %', digits=(16, 2)) + employee_per = fields.Float(string='Employee %', digits=(16, 2), compute='compute_percentage_hours', store=True) manager_hour = fields.Float(string='Manager Hour') employee_hour = fields.Float(string='Employee Hour') @@ -96,7 +95,7 @@ class Project(models.Model): if record.profit_amt > 0 and record.budgeted_revenue > 0: record.profit_per = (record.profit_amt / record.budgeted_revenue) * 100 - @api.depends('sale_line_employee_ids', 'hourly_rate2', 'budgeted_hours') + @api.depends('sale_line_employee_ids', 'budgeted_hours') def onchange_compute_values(self): for record in self: hour = 0.0 @@ -111,11 +110,13 @@ class Project(models.Model): if record.project_type == 'hours_in_consultant': record.cost = cost record.budgeted_hours = hour + if hour > 0.0: + record.hourly_rate = (cost / hour) else: - record.cost = record.budgeted_hours * record.hourly_rate2 + record.cost = record.budgeted_hours * record.hourly_rate + if record.budgeted_hours > 0.0: + record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours) record.consultant_cost = consultant_cost - if hour > 0.0: - record.hourly_rate = (cost / hour) record.budgeted_hour_week = budgeted_hour_week @@ -143,12 +144,12 @@ class InheritProjectProductEmployeeMap(models.Model): 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("Timesheet Cost", compute='_compute_total_cost', default=0.0, store=True) - consultant_cost = fields.Float("Total", compute='_compute_total_cost') + cost = fields.Float("Cost", compute='_compute_total_cost', default=0.0, store=True) + consultant_cost = fields.Float("Actual Cost", compute='_compute_total_cost') hour_distribution = fields.Selection(related='project_id.hour_distribution') role = fields.Selection([('Manager', 'Manager'), - ('Employee', 'Employee'), ], string=" ", default="Employee") + ('Employee', 'Employee'), ], string="Role", default="Employee") distribution_per = fields.Float("%") def _compute_timesheet_hour(self): diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index c173815..865408f 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -72,7 +72,7 @@ + attrs="{'required': [('hour_distribution','=','Percentage')]}"/> @@ -110,9 +110,7 @@ - - + From 23e85a9101ba93a1c5dd26aca466334466c4641e Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Thu, 7 Jan 2021 10:04:44 +0530 Subject: [PATCH 017/182] project default updated --- project_forecast/models/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_forecast/models/project.py b/project_forecast/models/project.py index 7860de7..faa4721 100755 --- a/project_forecast/models/project.py +++ b/project_forecast/models/project.py @@ -17,7 +17,7 @@ class Project(models.Model): def action_view_project_forecast_action_from_project(self): action = self.env["ir.actions.actions"]._for_xml_id("project_forecast.project_forecast_action_from_project") - action['context'] = {'default_project_id': self.id} + action['context'] = {'default_project_id': self.id, 'search_default_project_id': [self.id]} return action From d8f1be8b7b848d4fb32d0cafa9aff91287feb474 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 10:05:46 +0530 Subject: [PATCH 018/182] remove error --- cor_custom/models/project.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index dafe130..eccb4ef 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -50,6 +50,7 @@ class Project(models.Model): other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) hourly_rate = fields.Float("Hourly Rate", compute='onchange_compute_values', store=True) + hourly_rate2 = fields.Float("Hourly Ratee") 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) From a2097b877ac4986ddcad94c6b7dbf6d6bc83438f Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 11:26:33 +0530 Subject: [PATCH 019/182] update timesheet actual cost --- cor_custom/models/project.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index eccb4ef..34c1005 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -46,7 +46,7 @@ class Project(models.Model): expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) cost = fields.Float("Total Revenue", compute='onchange_compute_values', store=True) - consultant_cost = fields.Float("Actual Cost", compute='onchange_compute_values', store=True) + consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) hourly_rate = fields.Float("Hourly Rate", compute='onchange_compute_values', store=True) @@ -64,6 +64,13 @@ class Project(models.Model): manager_hour = fields.Float(string='Manager Hour') employee_hour = fields.Float(string='Employee Hour') + def _compute_consultant_timesheet_hours(self): + for record in self: + consultant_cost = 0.0 + for rec in record.sale_line_employee_ids: + consultant_cost = consultant_cost + rec.consultant_cost + record.consultant_cost = consultant_cost + @api.depends('manager_per', 'hour_distribution') def compute_percentage_hours(self): for record in self: @@ -99,13 +106,15 @@ class Project(models.Model): @api.depends('sale_line_employee_ids', 'budgeted_hours') def onchange_compute_values(self): for record in self: + print('TTTTTTTTTTTTTTTTTTTTTT') hour = 0.0 cost = 0.0 - consultant_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 + #consultant_cost = consultant_cost + rec.consultant_cost + #print('SSSSSSSSSSSSSS', consultant_cost) cost = cost + rec.cost budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week if record.project_type == 'hours_in_consultant': @@ -117,7 +126,7 @@ class Project(models.Model): record.cost = record.budgeted_hours * record.hourly_rate if record.budgeted_hours > 0.0: record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours) - record.consultant_cost = consultant_cost + #record.consultant_cost = consultant_cost record.budgeted_hour_week = budgeted_hour_week @@ -153,6 +162,7 @@ class InheritProjectProductEmployeeMap(models.Model): ('Employee', 'Employee'), ], string="Role", default="Employee") distribution_per = fields.Float("%") + def _compute_timesheet_hour(self): for val in self: self._cr.execute('''SELECT project_id, employee_id, SUM(unit_amount) FROM account_analytic_line @@ -164,6 +174,8 @@ class InheritProjectProductEmployeeMap(models.Model): val.timesheet_hour = res[2] else: val.timesheet_hour = 0.0 + #Run another method + #val.project_id.onchange_compute_values() def _compute_budgeted_hour_week(self): for val in self: From 9ca2ec1ffea4f97ed2704f46119611bcf5b32b4b Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Thu, 7 Jan 2021 11:26:41 +0530 Subject: [PATCH 020/182] planning constraint added --- planning/models/planning.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/planning/models/planning.py b/planning/models/planning.py index 6769cad..f590aa0 100755 --- a/planning/models/planning.py +++ b/planning/models/planning.py @@ -10,7 +10,7 @@ import uuid from math import ceil from odoo import api, fields, models, _ -from odoo.exceptions import UserError, AccessError +from odoo.exceptions import UserError, AccessError, ValidationError from odoo.osv import expression from odoo.tools.safe_eval import safe_eval from odoo.tools import format_time @@ -92,6 +92,25 @@ class Planning(models.Model): ('check_allocated_hours_positive', 'CHECK(allocated_hours >= 0)', 'You cannot have negative shift'), ] + @api.constrains('start_datetime', 'end_datetime', 'employee_id') + def _check_same_time_valid(self): + if self.ids: + self.flush(['start_datetime', 'end_datetime', 'employee_id']) + query = """ + SELECT S1.id,count(*) FROM + planning_slot S1, planning_slot S2 + WHERE + S1.start_datetime < S2.end_datetime and S1.end_datetime > S2.start_datetime and S1.id <> S2.id and S1.employee_id = S2.employee_id + GROUP BY S1.id; + """ + self.env.cr.execute(query, (tuple(self.ids),)) + overlap_mapping = dict(self.env.cr.fetchall()) + for slot in self: + if overlap_mapping.get(slot.id, 0) >= 1: + raise ValidationError(_('Planning already assigned for this employee at the same time.')) + + + @api.depends('employee_id') def _compute_planning_slot_company_id(self): if self.employee_id: From 050e4b58aa43f5fb2a7127593ab4cebbfc64b559 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 12:03:39 +0530 Subject: [PATCH 021/182] update changes --- cor_custom/models/project.py | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 34c1005..076096f 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -49,7 +49,7 @@ class Project(models.Model): consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Hourly Rate", compute='onchange_compute_values', store=True) + hourly_rate = fields.Float("Hourly Rate", compute='_compute_consultant_timesheet_hours') hourly_rate2 = fields.Float("Hourly Ratee") 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) @@ -70,6 +70,10 @@ class Project(models.Model): for rec in record.sale_line_employee_ids: consultant_cost = consultant_cost + rec.consultant_cost record.consultant_cost = consultant_cost + total_exp = record.consultant_cost + record.expenses_amt + record.total_expenses = total_exp + if record.budgeted_hours > 0.0: + record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours) @api.depends('manager_per', 'hour_distribution') def compute_percentage_hours(self): @@ -106,41 +110,23 @@ class Project(models.Model): @api.depends('sale_line_employee_ids', 'budgeted_hours') def onchange_compute_values(self): for record in self: - print('TTTTTTTTTTTTTTTTTTTTTT') 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 - #print('SSSSSSSSSSSSSS', consultant_cost) cost = cost + rec.cost budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week if record.project_type == 'hours_in_consultant': record.cost = cost record.budgeted_hours = hour - if hour > 0.0: - record.hourly_rate = (cost / hour) + #if hour > 0.0: + #record.hourly_rate = (cost / hour) else: record.cost = record.budgeted_hours * record.hourly_rate - if record.budgeted_hours > 0.0: - record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours) - #record.consultant_cost = consultant_cost record.budgeted_hour_week = budgeted_hour_week - # price_unit = 0.0 - # count = 0.0 - # for rec in record.sale_line_employee_ids: - # price_unit = price_unit + rec.price_unit - # count = count + 1 - # if record.budgeted_hours > 0.0 and count > 0.0: - # avg =(record.budgeted_hours/count) - # hourly_rate = price_unit * avg - # record.hourly_rate = (price_unit * avg)/record.budgeted_hours - - class InheritProjectProductEmployeeMap(models.Model): _inherit = 'project.sale.line.employee.map' From 885bb68164d93927b8a1f221d3b78751db5b5e11 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 12:08:36 +0530 Subject: [PATCH 022/182] default hourly rate 0.0 --- cor_custom/models/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 076096f..0fea422 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -49,7 +49,7 @@ class Project(models.Model): consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Hourly Rate", compute='_compute_consultant_timesheet_hours') + hourly_rate = fields.Float("Hourly Rate", compute='_compute_consultant_timesheet_hours', default=0.0) hourly_rate2 = fields.Float("Hourly Ratee") 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) From cab1e08f32fe8c378be22c220454650c3a9d4212 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 12:11:14 +0530 Subject: [PATCH 023/182] default hourly rate 0.0 --- cor_custom/models/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 0fea422..856c05e 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -49,7 +49,7 @@ class Project(models.Model): consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Hourly Rate", compute='_compute_consultant_timesheet_hours', default=0.0) + hourly_rate = fields.Float("Hourly Rate", default=0.0) hourly_rate2 = fields.Float("Hourly Ratee") 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) From d016c02b185aade93f34b90cd31c317ef550d89b Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 12:19:25 +0530 Subject: [PATCH 024/182] update changes --- cor_custom/models/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 856c05e..caa4e0f 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -49,7 +49,7 @@ class Project(models.Model): consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Hourly Rate", default=0.0) + hourly_rate = fields.Float("Hourly Rate", default=0.0, readonly=1) hourly_rate2 = fields.Float("Hourly Ratee") 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) From 437c186f3d9705e0475ca762dd9d972c04bddd16 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 13:44:24 +0530 Subject: [PATCH 025/182] update code --- cor_custom/models/project.py | 57 ++++++++++++++++++++----------- cor_custom/views/project_view.xml | 6 ++-- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index caa4e0f..8c1729f 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -41,7 +41,7 @@ class Project(models.Model): start_date = fields.Date(string='Start Date') end_date = fields.Date(string='End Date') - budgeted_hours = fields.Float(string='Total Budgeted Hours', digits=(16, 2)) + budgeted_hours = fields.Float(string='Total Budgeted Hours') budgeted_revenue = fields.Float(string='Budgeted Revenue', digits=(16, 2)) expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) @@ -49,7 +49,7 @@ class Project(models.Model): consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) - hourly_rate = fields.Float("Hourly Rate", default=0.0, readonly=1) + hourly_rate = fields.Float("Hourly Rate", default=0.0) hourly_rate2 = fields.Float("Hourly Ratee") 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) @@ -97,6 +97,20 @@ class Project(models.Model): expense_amount = self.budgeted_revenue * (self.expenses_per / 100) self.expenses_amt = expense_amount + @api.onchange('budgeted_revenue', 'sale_line_employee_ids') + def onchange_budgeted_hour(self): + self.sale_line_employee_ids._compute_total_cost() + hour = 0.0 + for rec in self.sale_line_employee_ids: + hour = hour + rec.budgeted_qty + print('TTTTTTTTTTTTTTT', hour, rec.budgeted_qty) + print('SSSSSSSSS', hour) + self.budgeted_hours = hour + print('TTTTTTTTTTTTTTT', hour) + print('UUUUUUUUUUU', self.budgeted_hours) + if self.budgeted_hours > 0.0: + self.hourly_rate = (self.budgeted_revenue / self.budgeted_hours) + @api.depends('cost', 'expenses_amt', 'budgeted_revenue') def _compute_calc(self): for record in self: @@ -107,30 +121,30 @@ class Project(models.Model): if record.profit_amt > 0 and record.budgeted_revenue > 0: record.profit_per = (record.profit_amt / record.budgeted_revenue) * 100 - @api.depends('sale_line_employee_ids', 'budgeted_hours') + @api.depends('sale_line_employee_ids') def onchange_compute_values(self): for record in self: - hour = 0.0 + # hour = 0.0 cost = 0.0 budgeted_hour_week = 0.0 for rec in record.sale_line_employee_ids: - hour = hour + rec.budgeted_qty + # hour = hour + rec.budgeted_qty cost = cost + rec.cost budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week if record.project_type == 'hours_in_consultant': record.cost = cost - record.budgeted_hours = hour - #if hour > 0.0: - #record.hourly_rate = (cost / hour) - else: - record.cost = record.budgeted_hours * record.hourly_rate + # record.budgeted_hours = hour + # if hour > 0.0: + # record.hourly_rate = (cost / hour) + # else: + # record.cost = record.budgeted_hours * record.hourly_rate record.budgeted_hour_week = budgeted_hour_week class InheritProjectProductEmployeeMap(models.Model): _inherit = 'project.sale.line.employee.map' - budgeted_qty = fields.Float(string='Budgeted Hours', store=True) + budgeted_qty = fields.Float(string='Budgeted Hours') budgeted_uom = fields.Many2one('uom.uom', string='Budgeted UOM', related='sale_line_id.product_uom', readonly=True) # budgeted_uom = fields.Many2one('uom.uom', string='Budgeted UOM', related='timesheet_product_id.uom_id', readonly=True) timesheet_hour = fields.Float("Timesheet Hour", compute='_compute_timesheet_hour', default=0.0) @@ -140,15 +154,14 @@ class InheritProjectProductEmployeeMap(models.Model): 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', default=0.0, store=True) - consultant_cost = fields.Float("Actual Cost", compute='_compute_total_cost') + cost = fields.Float("Cost", default=0.0, store=True) + consultant_cost = fields.Float("Actual Cost") hour_distribution = fields.Selection(related='project_id.hour_distribution') role = fields.Selection([('Manager', 'Manager'), ('Employee', 'Employee'), ], string="Role", default="Employee") distribution_per = fields.Float("%") - def _compute_timesheet_hour(self): for val in self: self._cr.execute('''SELECT project_id, employee_id, SUM(unit_amount) FROM account_analytic_line @@ -160,8 +173,8 @@ class InheritProjectProductEmployeeMap(models.Model): val.timesheet_hour = res[2] else: val.timesheet_hour = 0.0 - #Run another method - #val.project_id.onchange_compute_values() + # Run another method + # val.project_id.onchange_compute_values() def _compute_budgeted_hour_week(self): for val in self: @@ -170,20 +183,24 @@ class InheritProjectProductEmployeeMap(models.Model): else: val.budgeted_hour_week = 0 + @api.onchange('project_id.budgeted_revenue', 'price_unit', 'distribution_per', 'employee_id', 'role') def _compute_total_cost(self): for val in self: 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) + 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.cost = val.project_id.budgeted_revenue * (val.project_id.employee_per / 100) * ( + val.distribution_per / 100) if val.price_unit > 0.0: - val.budgeted_qty = val.cost/val.price_unit + val.budgeted_qty = val.cost / val.price_unit else: val.cost = 0.0 - #val.cost = val.budgeted_qty * val.price_unit + # val.cost = val.budgeted_qty * val.price_unit val.consultant_cost = val.timesheet_hour * val.employee_price + #self.project_id.onchange_budgeted_hour() @api.depends('sale_line_id', 'sale_line_id.price_unit', 'timesheet_product_id') def _compute_price_unit(self): diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 865408f..bdbf97d 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -107,10 +107,8 @@ - - + + From 5f6f7fb4e0734610311927eb99adbc9e1c0d3b13 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 14:01:47 +0530 Subject: [PATCH 026/182] update timesheet hour issue --- cor_custom/models/project.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 8c1729f..03d4e16 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -65,6 +65,7 @@ class Project(models.Model): employee_hour = fields.Float(string='Employee Hour') def _compute_consultant_timesheet_hours(self): + print('222222222222') for record in self: consultant_cost = 0.0 for rec in record.sale_line_employee_ids: @@ -155,7 +156,7 @@ class InheritProjectProductEmployeeMap(models.Model): readonly=False) sale_line_id = fields.Many2one('sale.order.line', "Service", domain=[('is_service', '=', True)]) cost = fields.Float("Cost", default=0.0, store=True) - consultant_cost = fields.Float("Actual Cost") + consultant_cost = fields.Float("Actual Cost", compute='_compute_timesheet_hour', default=0.0) hour_distribution = fields.Selection(related='project_id.hour_distribution') role = fields.Selection([('Manager', 'Manager'), @@ -173,6 +174,7 @@ class InheritProjectProductEmployeeMap(models.Model): val.timesheet_hour = res[2] else: val.timesheet_hour = 0.0 + val.consultant_cost = val.timesheet_hour * val.employee_price # Run another method # val.project_id.onchange_compute_values() @@ -199,7 +201,7 @@ class InheritProjectProductEmployeeMap(models.Model): else: val.cost = 0.0 # val.cost = val.budgeted_qty * val.price_unit - val.consultant_cost = val.timesheet_hour * val.employee_price + #val.consultant_cost = val.timesheet_hour * val.employee_price #self.project_id.onchange_budgeted_hour() @api.depends('sale_line_id', 'sale_line_id.price_unit', 'timesheet_product_id') From b4d880179dc8a11b2f04a8739d3228a449f41653 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 14:08:15 +0530 Subject: [PATCH 027/182] update total hour issue --- cor_custom/models/project.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 03d4e16..27cc04b 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -41,7 +41,7 @@ class Project(models.Model): start_date = fields.Date(string='Start Date') end_date = fields.Date(string='End Date') - budgeted_hours = fields.Float(string='Total Budgeted Hours') + budgeted_hours = fields.Float(string='Total Budgeted Hours', compute='_compute_consultant_timesheet_hours') budgeted_revenue = fields.Float(string='Budgeted Revenue', digits=(16, 2)) expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) @@ -68,9 +68,12 @@ class Project(models.Model): print('222222222222') for record in self: consultant_cost = 0.0 + hour = 0.0 for rec in record.sale_line_employee_ids: consultant_cost = consultant_cost + rec.consultant_cost + hour = hour + rec.budgeted_qty record.consultant_cost = consultant_cost + record.budgeted_hours = hour total_exp = record.consultant_cost + record.expenses_amt record.total_expenses = total_exp if record.budgeted_hours > 0.0: From a389daa5f5f7d3755f4136f18963ea1e32a361ed Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 14:52:15 +0530 Subject: [PATCH 028/182] update code for budgeted hour --- cor_custom/models/project.py | 19 ++++--------------- cor_custom/views/project_view.xml | 4 +++- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 27cc04b..3625c4b 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -42,6 +42,7 @@ class Project(models.Model): start_date = fields.Date(string='Start Date') end_date = fields.Date(string='End Date') budgeted_hours = fields.Float(string='Total Budgeted Hours', compute='_compute_consultant_timesheet_hours') + budgeted_hours2 = fields.Float(string='Total Budgeted Hours') budgeted_revenue = fields.Float(string='Budgeted Revenue', digits=(16, 2)) expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) @@ -65,7 +66,6 @@ class Project(models.Model): employee_hour = fields.Float(string='Employee Hour') def _compute_consultant_timesheet_hours(self): - print('222222222222') for record in self: consultant_cost = 0.0 hour = 0.0 @@ -76,8 +76,10 @@ class Project(models.Model): record.budgeted_hours = hour total_exp = record.consultant_cost + record.expenses_amt record.total_expenses = total_exp - if record.budgeted_hours > 0.0: + if record.project_type == 'hours_in_consultant' and record.budgeted_hours > 0.0: record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours) + if record.project_type == 'hours_no_limit' and record.budgeted_hours2 > 0.0: + record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours2) @api.depends('manager_per', 'hour_distribution') def compute_percentage_hours(self): @@ -107,11 +109,7 @@ class Project(models.Model): hour = 0.0 for rec in self.sale_line_employee_ids: hour = hour + rec.budgeted_qty - print('TTTTTTTTTTTTTTT', hour, rec.budgeted_qty) - print('SSSSSSSSS', hour) self.budgeted_hours = hour - print('TTTTTTTTTTTTTTT', hour) - print('UUUUUUUUUUU', self.budgeted_hours) if self.budgeted_hours > 0.0: self.hourly_rate = (self.budgeted_revenue / self.budgeted_hours) @@ -128,20 +126,13 @@ class Project(models.Model): @api.depends('sale_line_employee_ids') def onchange_compute_values(self): for record in self: - # hour = 0.0 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 budgeted_hour_week = budgeted_hour_week + rec.budgeted_hour_week if record.project_type == 'hours_in_consultant': record.cost = cost - # record.budgeted_hours = hour - # if hour > 0.0: - # record.hourly_rate = (cost / hour) - # else: - # record.cost = record.budgeted_hours * record.hourly_rate record.budgeted_hour_week = budgeted_hour_week @@ -178,8 +169,6 @@ class InheritProjectProductEmployeeMap(models.Model): else: val.timesheet_hour = 0.0 val.consultant_cost = val.timesheet_hour * val.employee_price - # Run another method - # val.project_id.onchange_compute_values() def _compute_budgeted_hour_week(self): for val in self: diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index bdbf97d..2376f33 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -107,7 +107,9 @@ - + + From 9af18685271eeac41e14cd5cee8c67f53efba0eb Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Thu, 7 Jan 2021 14:54:56 +0530 Subject: [PATCH 029/182] updated domain, profit --- cor_custom/models/analytic.py | 45 ++++++++++++++++++++++++++++++ cor_custom/models/project.py | 18 +++++++----- cor_custom/views/analytic_view.xml | 11 ++++++++ cor_custom/views/project_view.xml | 4 +-- planning/models/planning.py | 4 +-- project_forecast/i18n/he_IL .po | 0 project_maintenance/i18n/he_IL.po | 0 7 files changed, 71 insertions(+), 11 deletions(-) mode change 100644 => 100755 project_forecast/i18n/he_IL .po mode change 100644 => 100755 project_maintenance/i18n/he_IL.po diff --git a/cor_custom/models/analytic.py b/cor_custom/models/analytic.py index 8d4c801..4fe75d0 100755 --- a/cor_custom/models/analytic.py +++ b/cor_custom/models/analytic.py @@ -14,7 +14,52 @@ class AccountAnalyticLine(models.Model): start_time = fields.Float(string='Start Time', digits=(16, 2)) end_time = fields.Float(string='End Time', digits=(16, 2)) + unit_amount = fields.Float('Duration', default=0.0) + @api.onchange('employee_id') + def _onchange_employee_id(self): + domain = [] + if self.employee_id and self.employee_id.user_id: + manager_id = self.env['project.project'].search( + [('user_id', '=', self.employee_id.user_id.id), ('allow_forecast', '=', True)]).ids + emp_project_ids = self.env['project.project'].search( + [('privacy_visibility', 'in', ('employees', 'portal')), ('allow_forecast', '=', True)]).ids + project_ids = self.env['project.project'].search( + [('privacy_visibility', '=', 'followers'), ('allow_forecast', '=', True), + ('allowed_internal_user_ids', 'in', self.employee_id.user_id.id)]).ids + consul_ids = self.env['project.sale.line.employee.map'].search([('employee_id', '=', self.employee_id.id)]) + consul_project_ids = [val.project_id.id for val in consul_ids] + emp_all_project_ids = manager_id + emp_project_ids + project_ids + consul_project_ids + domain = [('id', 'in', list(set(emp_all_project_ids)))] + result = { + 'domain': {'project_id': domain}, + } + return result + + @api.onchange('project_id') + def _onchange_project_id(self): + domain = [] if not self.project_id else [('project_id', '=', self.project_id.id)] + manager_id = [] + user_ids = [] + consul_project_ids = [] + if self.project_id: + consul_ids = self.env['project.sale.line.employee.map'].search([('project_id', '=', self.project_id.id)]) + consul_project_ids = [val.employee_id.id for val in consul_ids] + if self.project_id and self.project_id.user_id: + manager_id = self.env['hr.employee'].search([('user_id', '=', self.project_id.user_id.id)]).ids + if self.project_id and self.project_id.privacy_visibility in ('employees', 'portal'): + user_ids = self.env['hr.employee'].search([('user_id', '!=', False)]).ids + if self.project_id and self.project_id.privacy_visibility == 'followers': + user_ids = self.env['hr.employee'].search( + [('user_id', 'in', self.project_id.allowed_internal_user_ids.ids)]).ids + project_all_emp_ids = manager_id + user_ids + consul_project_ids + result = { + 'domain': {'task_id': domain, 'employee_id': [('id', 'in', project_all_emp_ids)]}, + } + if self.project_id != self.task_id.project_id: + # reset task when changing project + self.task_id = False + return result _sql_constraints = [ ('check_start_time_lower_than_24', 'CHECK(start_time <= 24)', 'You cannot have a start hour greater than 24'), diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index 27cc04b..c09dd24 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -41,12 +41,12 @@ class Project(models.Model): start_date = fields.Date(string='Start Date') end_date = fields.Date(string='End Date') - budgeted_hours = fields.Float(string='Total Budgeted Hours', compute='_compute_consultant_timesheet_hours') + budgeted_hours = fields.Float(string='Total Budgeted Hours', compute='_compute_calc') budgeted_revenue = fields.Float(string='Budgeted Revenue', digits=(16, 2)) expenses_per = fields.Float(string='Expenses (%)', digits=(16, 2)) expenses_amt = fields.Float(string='Expenses Amount', digits=(16, 2)) cost = fields.Float("Total Revenue", compute='onchange_compute_values', store=True) - consultant_cost = fields.Float("Actual Cost", compute='_compute_consultant_timesheet_hours') + consultant_cost = fields.Float("Actual Cost", compute='_compute_calc') other_expenses = fields.Float(string='Other Expenses', related='expenses_amt') total_expenses = fields.Float(string='Total Expenses', digits=(16, 2), compute='_compute_calc', store=True) hourly_rate = fields.Float("Hourly Rate", default=0.0) @@ -64,7 +64,8 @@ class Project(models.Model): manager_hour = fields.Float(string='Manager Hour') employee_hour = fields.Float(string='Employee Hour') - def _compute_consultant_timesheet_hours(self): + @api.depends('cost', 'expenses_amt', 'budgeted_revenue') + def _compute_calc(self): print('222222222222') for record in self: consultant_cost = 0.0 @@ -76,8 +77,11 @@ class Project(models.Model): record.budgeted_hours = hour total_exp = record.consultant_cost + record.expenses_amt record.total_expenses = total_exp - if record.budgeted_hours > 0.0: - record.hourly_rate = (record.budgeted_revenue / record.budgeted_hours) + profit_amt = record.budgeted_revenue - total_exp + record.profit_amt = profit_amt + if record.profit_amt > 0 and record.budgeted_revenue > 0: + record.profit_per = (record.profit_amt / record.budgeted_revenue) * 100 + @api.depends('manager_per', 'hour_distribution') def compute_percentage_hours(self): @@ -115,7 +119,7 @@ class Project(models.Model): if self.budgeted_hours > 0.0: self.hourly_rate = (self.budgeted_revenue / self.budgeted_hours) - @api.depends('cost', 'expenses_amt', 'budgeted_revenue') + """@api.depends('cost', 'expenses_amt', 'budgeted_revenue') def _compute_calc(self): for record in self: total_exp = record.consultant_cost + record.expenses_amt @@ -123,7 +127,7 @@ class Project(models.Model): profit_amt = record.budgeted_revenue - total_exp record.profit_amt = profit_amt if record.profit_amt > 0 and record.budgeted_revenue > 0: - record.profit_per = (record.profit_amt / record.budgeted_revenue) * 100 + record.profit_per = (record.profit_amt / record.budgeted_revenue) * 100""" @api.depends('sale_line_employee_ids') def onchange_compute_values(self): diff --git a/cor_custom/views/analytic_view.xml b/cor_custom/views/analytic_view.xml index a03a447..117f463 100755 --- a/cor_custom/views/analytic_view.xml +++ b/cor_custom/views/analytic_view.xml @@ -15,6 +15,17 @@ --> + + Analytic line + account.analytic.line + + + + + + + + account.analytic.line.tree.hr_timesheet_inherit1 account.analytic.line diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index bdbf97d..c0007f3 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -6,11 +6,11 @@ project.project -
+ diff --git a/planning/models/planning.py b/planning/models/planning.py index f590aa0..6e88d55 100755 --- a/planning/models/planning.py +++ b/planning/models/planning.py @@ -321,8 +321,8 @@ class Planning(models.Model): ) else: name = '%s - %s %s' % ( - start_datetime.date(), - end_datetime.date(), + datetime.strftime(start_datetime.date(), "%d/%m/%Y"), + datetime.strftime(end_datetime.date(), "%d/%m/%Y"), name ) diff --git a/project_forecast/i18n/he_IL .po b/project_forecast/i18n/he_IL .po old mode 100644 new mode 100755 diff --git a/project_maintenance/i18n/he_IL.po b/project_maintenance/i18n/he_IL.po old mode 100644 new mode 100755 From c904fdbc1dc1fda9c9b77c1f1daa649dba50e9d4 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 15:10:01 +0530 Subject: [PATCH 030/182] commit changes --- project_forecast/i18n/he_IL .po | 0 project_maintenance/i18n/he_IL.po | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 project_forecast/i18n/he_IL .po mode change 100644 => 100755 project_maintenance/i18n/he_IL.po diff --git a/project_forecast/i18n/he_IL .po b/project_forecast/i18n/he_IL .po old mode 100644 new mode 100755 diff --git a/project_maintenance/i18n/he_IL.po b/project_maintenance/i18n/he_IL.po old mode 100644 new mode 100755 From bc27b5b1006f1598ec57037a4f72c3b605372f88 Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Thu, 7 Jan 2021 15:10:25 +0530 Subject: [PATCH 031/182] uncommit code --- cor_custom/models/analytic.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cor_custom/models/analytic.py b/cor_custom/models/analytic.py index 4fe75d0..d851d9c 100755 --- a/cor_custom/models/analytic.py +++ b/cor_custom/models/analytic.py @@ -16,7 +16,7 @@ class AccountAnalyticLine(models.Model): end_time = fields.Float(string='End Time', digits=(16, 2)) unit_amount = fields.Float('Duration', default=0.0) - @api.onchange('employee_id') + """@api.onchange('employee_id') def _onchange_employee_id(self): domain = [] if self.employee_id and self.employee_id.user_id: @@ -34,9 +34,9 @@ class AccountAnalyticLine(models.Model): result = { 'domain': {'project_id': domain}, } - return result + return result""" - @api.onchange('project_id') + """@api.onchange('project_id') def _onchange_project_id(self): domain = [] if not self.project_id else [('project_id', '=', self.project_id.id)] manager_id = [] @@ -59,7 +59,7 @@ class AccountAnalyticLine(models.Model): if self.project_id != self.task_id.project_id: # reset task when changing project self.task_id = False - return result + return result""" _sql_constraints = [ ('check_start_time_lower_than_24', 'CHECK(start_time <= 24)', 'You cannot have a start hour greater than 24'), From ba9d6bca168c02bedd31c8109fc3beffb829e89b Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Thu, 7 Jan 2021 15:24:45 +0530 Subject: [PATCH 032/182] method code update --- cor_custom/models/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cor_custom/models/project.py b/cor_custom/models/project.py index d7f2f10..f6208cd 100755 --- a/cor_custom/models/project.py +++ b/cor_custom/models/project.py @@ -67,7 +67,7 @@ class Project(models.Model): @api.depends('cost', 'expenses_amt', 'budgeted_revenue') - def _compute_consultant_timesheet_hours(self): + def _compute_calc(self): for record in self: consultant_cost = 0.0 hour = 0.0 From 746df6b7d21cf7dcdc37efd590882f502d11daa2 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Thu, 7 Jan 2021 16:31:20 +0530 Subject: [PATCH 033/182] hide project overview, create expense and mandatory employee user_id --- cor_custom/views/hr_employee_views.xml | 3 +++ cor_custom/views/project_view.xml | 7 ++++++- project_report/__manifest__.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cor_custom/views/hr_employee_views.xml b/cor_custom/views/hr_employee_views.xml index 0c8f6e8..b20ad60 100755 --- a/cor_custom/views/hr_employee_views.xml +++ b/cor_custom/views/hr_employee_views.xml @@ -9,6 +9,9 @@ + + + diff --git a/cor_custom/views/project_view.xml b/cor_custom/views/project_view.xml index 73389a7..513c0bf 100755 --- a/cor_custom/views/project_view.xml +++ b/cor_custom/views/project_view.xml @@ -29,6 +29,10 @@ project.project + + +
+
+
+ + diff --git a/cor_custom/wizard/project_multi_budget_assign.py b/cor_custom/wizard/project_multi_budget_assign.py new file mode 100755 index 0000000..1b511ab --- /dev/null +++ b/cor_custom/wizard/project_multi_budget_assign.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, _ +from odoo.exceptions import UserError, ValidationError +from dateutil.relativedelta import relativedelta + +class ProjectMultiBudgetAssign(models.TransientModel): + _name = 'project.multi.budget.assign' + _description = 'Project multi budget assign' + + project_id = fields.Many2one('project.project', string="Project", required=True) + start_date = fields.Date('Start Date', required=True, default=fields.Date.context_today) + end_date = fields.Date('End Date', required=True) + project_multi_line = fields.One2many('project.multi.budget.assign.line', 'line_id', 'Consultant Details') + + @api.model + def default_get(self, fields): + res = super(ProjectMultiBudgetAssign, self).default_get(fields) + res_id = self._context.get('active_id') + record = self.env['project.project'].browse(res_id) + lines = [] + print("record.sale_line_employee_ids", record.sale_line_employee_ids) + for rec in record.sale_line_employee_ids: + cons = {} + all_cons = self.env['project.consultant.hrs'].search([('employee_id','=',rec.employee_id.id),('project_id','=',rec.project_id.id)]) + all_per = [v.percentage for v in all_cons] + if sum(all_per) < 100: + cons.update({'employee_id': rec.employee_id.id, 'emp_map_id':rec.id, 'project_id':res_id}) + lines.append((0, 0, cons)) + if record and (not record.pricing_type == 'employee_rate' or not record.project_type == 'hours_in_consultant'): + raise ValidationError(_('Not applicable for this project type ')) + if not lines: + raise ValidationError(_('Not applicable, Please assign or check consultant')) + if record and not record.date_start or not record.date: + raise UserError(_('Project start date and end date should not be blank')) + res.update({'project_id':res_id, 'project_multi_line': lines}) + return res + + @api.constrains('start_date', 'end_date') + def _check_dates(self): + for rec in self: + if rec.end_date < rec.start_date: + raise ValidationError(_('Start date must be earlier than end date.')) + + @api.onchange('start_date') + def onchange_start_date(self): + if self.start_date: + self.end_date = self.start_date + relativedelta(days=6) + + def action_create_budgeted_hrs(self): + record = self.env['project.consultant.hrs'] + res_id = self._context.get('active_id') + for val in self: + for line in val.project_multi_line: + record.create({'project_id':res_id, + 'employee_id':line.employee_id.id, + 'start_date':val.start_date, + 'end_date':val.end_date, + 'budgeted_hours':line.budgeted_hours, + 'percentage':line.percentage}) + return True + + +class ProjectMultiBudgetAssignLine(models.TransientModel): + _name = 'project.multi.budget.assign.line' + _description = 'Project multi budget assign line' + + """domain = lambda self: self._get_employee_id_domain(), + @api.model + def _get_employee_id_domain(self): + project_id = self._context.get('active_id') + record = self.env['project.project'].browse(project_id) + emp_ids = [emp.employee_id.id for emp in record.sale_line_employee_ids] + return [('id','in', emp_ids)]""" + + line_id = fields.Many2one('project.multi.budget.assign', string="Line ID", required=True) + project_id = fields.Many2one('project.project', string="Project", required=True) + emp_map_id = fields.Many2one('project.sale.line.employee.map', string="Consultant Map", required=True) + employee_id = fields.Many2one('hr.employee', string="Consultant", required=True) + budgeted_qty = fields.Float(string='Budgeted Hours', related="emp_map_id.budgeted_qty") + all_percentage = fields.Float("Total Allocated (%)", compute='_compute_allocation') + rem_percentage = fields.Float("Total Unallocated (%)", compute='_compute_allocation') + percentage = fields.Float("Percentage (%)") + budgeted_hours = fields.Float("Budgeted Hours", compute='_compute_budgeted_hours', store=True) + + @api.depends('project_id', 'employee_id') + def _compute_allocation(self): + for val in self: + if val.project_id and val.employee_id: + cons = self.env['project.consultant.hrs'].search([('employee_id','=',val.employee_id.id),('project_id','=',val.project_id.id)]) + all_per = 0 + for res in cons: + all_per += res.percentage + #res = all_per - 100 + val.all_percentage = all_per + val.rem_percentage = 100 - all_per + else: + val.all_percentage = 0 + val.rem_percentage = 0 + + @api.depends('project_id', 'employee_id', 'project_id.sale_line_employee_ids', 'percentage') + def _compute_budgeted_hours(self): + for val in self: + if val.project_id and val.employee_id and val.percentage > 0: + budgeted = 0 + for emp in val.project_id.sale_line_employee_ids: + if emp.employee_id.id == val.employee_id.id: + budgeted = emp.budgeted_qty + val.budgeted_hours = (budgeted * val.percentage / 100) + else: + val.budgeted_hours = 0 + + """@api.onchange('employee_id', 'percentage') + def onchange_employee_id(self): + #res = {} + project_id = self._context.get('active_id') + record = self.env['project.project'].browse(project_id) + #emp_ids = [emp.employee_id.id for emp in record.sale_line_employee_ids] + #res['domain'] = {'employee_id': [('id', 'in', emp_ids)]} + if self.employee_id and self.percentage > 0: + print("self.employee_id", self.employee_id) + cons = [emp.budgeted_qty if emp.employee_id.id == self.employee_id.id else 0 for emp in record.sale_line_employee_ids] + budgeted = cons and cons[0] or 0 + if budgeted > 0: + self.budgeted_hours = (budgeted * self.percentage / 100) + else: + self.budgeted_hours = 0""" + #return res \ No newline at end of file diff --git a/cor_custom/wizard/project_multi_budget_assign_view.xml b/cor_custom/wizard/project_multi_budget_assign_view.xml new file mode 100755 index 0000000..9a023aa --- /dev/null +++ b/cor_custom/wizard/project_multi_budget_assign_view.xml @@ -0,0 +1,47 @@ + + + + + + Project Multi Budget + project.multi.budget.assign + +
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + Consultant Budget Hours Assign + project.multi.budget.assign + form + + new + + form + + +
+
From bec7b95d0b9715feac4bdf323ed150ba1ec977ad Mon Sep 17 00:00:00 2001 From: projectsodoo Date: Mon, 18 Jan 2021 22:56:10 +0530 Subject: [PATCH 061/182] Report updated based on consultant allocated --- project_report/__manifest__.py | 1 + .../report/project_budget_hrs_analysis.py | 58 ++++-------- .../project_budget_hrs_analysis_views.xml | 6 +- .../static/src/js/graph_renderer.js | 93 +++++++++++++++++++ project_report/views/assets.xml | 10 ++ 5 files changed, 127 insertions(+), 41 deletions(-) create mode 100755 project_report/static/src/js/graph_renderer.js create mode 100755 project_report/views/assets.xml diff --git a/project_report/__manifest__.py b/project_report/__manifest__.py index 2d16fb7..785de93 100755 --- a/project_report/__manifest__.py +++ b/project_report/__manifest__.py @@ -15,6 +15,7 @@ 'data': [ 'security/ir.model.access.csv', 'wizard/project_create_expenses_views.xml', + 'views/assets.xml', #'views/project_view.xml', 'report/project_budget_hrs_analysis_views.xml', 'report/project_budget_amt_analysis_views.xml', diff --git a/project_report/report/project_budget_hrs_analysis.py b/project_report/report/project_budget_hrs_analysis.py index f7bf342..78aa89e 100755 --- a/project_report/report/project_budget_hrs_analysis.py +++ b/project_report/report/project_budget_hrs_analysis.py @@ -13,14 +13,16 @@ class BudgetHrsAnalysis(models.Model): #analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', readonly=True) project_id = fields.Many2one('project.project', string='Project', readonly=True) + start_date = fields.Date(string='Start Date', readonly=True) + end_date = fields.Date(string='End Date', readonly=True) partner_id = fields.Many2one('res.partner', string='Client', readonly=True) employee_id = fields.Many2one('hr.employee', string='Consultant', readonly=True) hours_type = fields.Char(string="Hours Type", readonly=True) hours = fields.Float("Hours", digits=(16, 2), readonly=True, group_operator="sum") - 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) + #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) #budgeted_hours = fields.Float("Budgeted Hours", digits=(16, 2), readonly=True, group_operator="sum") #actual_hours = fields.Float("Actual Hours", digits=(16, 2), readonly=True, group_operator="sum") @@ -30,36 +32,20 @@ class BudgetHrsAnalysis(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, partner_id, employee_id, hours_type, project_type, hours from ( + SELECT ROW_NUMBER() OVER() as id, project_id, start_date, end_date, partner_id, employee_id, hours_type, + hours from ( SELECT PRO.id AS project_id, - PRO.create_date AS create_date, + Pro_emp_hours.start_date AS start_date, + Pro_emp_hours.end_date AS end_date, PRO.partner_id AS partner_id, - null::int AS employee_id, + Pro_emp_hours.employee_id AS employee_id, 'Budgeted Hours' as hours_type, - PRO.project_type as project_type, - PRO.budgeted_hours AS hours - 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 != 'fixed_rate' - and PRO.project_type = 'hours_no_limit' - Union - SELECT - PRO.id AS project_id, - PRO.create_date AS create_date, - PRO.partner_id AS partner_id, - Pro_emp.employee_id AS employee_id, - 'Budgeted Hours' as hours_type, - PRO.project_type as project_type, - Pro_emp.budgeted_qty as hours + Pro_emp_hours.budgeted_hours as hours FROM project_project PRO Left JOIN project_sale_line_employee_map Pro_emp ON Pro_emp.project_id = Pro.id + Left JOIN project_consultant_hrs Pro_emp_hours ON Pro_emp_hours.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 @@ -70,29 +56,23 @@ class BudgetHrsAnalysis(models.Model): Union SELECT PRO.id AS project_id, - PRO.create_date AS create_date, + Pro_emp_hours.start_date AS start_date, + Pro_emp_hours.end_date AS end_date, PRO.partner_id AS partner_id, - AAL.employee_id AS employee_id, + Pro_emp_hours.employee_id AS employee_id, 'Actual Hours' as hours_type, - PRO.project_type as project_type, - AAL.unit_amount AS hours + Pro_emp_hours.actual_hours AS hours FROM project_project PRO Left JOIN project_sale_line_employee_map Pro_emp ON Pro_emp.project_id = Pro.id + Left JOIN project_consultant_hrs Pro_emp_hours ON Pro_emp_hours.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 != 'fixed_rate' - group by - Pro.id, - --Pro_emp.id, - --PRO.partner_id, - AAL.employee_id, - AAL.unit_amount, - hours_type + and PRO.project_type = 'hours_in_consultant' ) as res order by project_id desc, diff --git a/project_report/report/project_budget_hrs_analysis_views.xml b/project_report/report/project_budget_hrs_analysis_views.xml index eb27313..83ea9ac 100755 --- a/project_report/report/project_budget_hrs_analysis_views.xml +++ b/project_report/report/project_budget_hrs_analysis_views.xml @@ -34,12 +34,14 @@ - - + + + diff --git a/project_report/static/src/js/graph_renderer.js b/project_report/static/src/js/graph_renderer.js new file mode 100755 index 0000000..449b64a --- /dev/null +++ b/project_report/static/src/js/graph_renderer.js @@ -0,0 +1,93 @@ +odoo.define("project_report.GraphRenderer", function(require) { +var GraphRenderer = require("web.GraphRenderer"); +var config = require("web.config"); +var field_utils = require("web.field_utils"); + +// Hide top legend when too many items for device size +var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); + + GraphRenderer.include({ + init: function(parent, state, params) { + this._super.apply(this, arguments); + console.log("Dataset Name", this); + this.title = 'Time line' + if (this.params && this.params.title) { + this.params.title = '111Time line' + } + console.log("Module Name", arguments); + console.log("this parent", parent); + console.log("this state", state); + console.log("this params", params); + }, + + _getElementOptions: function () { + var animationOptions = {}; + if (this.state.mode === 'bar') { + var animationOptions = { + duration: "0.1", + "onComplete": function() { + var chartInstance = this.chart, + ctx = chartInstance.ctx; + ctx.font = Chart.helpers.fontString(12, 'bold', "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif"); + ctx.textAlign = 'center'; + ctx.textBaseline = 'bottom'; + this.data.datasets.forEach(function(dataset, i) { + var meta = chartInstance.controller.getDatasetMeta(i); + meta.data.forEach(function(bar, index) { + var data = dataset.data[index]; + if(!!data){ + ctx.fillText(data, bar._model.x, bar._model.y - 5); + } + }); + }); + } + }; + } + return animationOptions; + }, + + _prepareOptions: function (datasetsCount) { + const options = { + maintainAspectRatio: false, + scales: this._getScaleOptions(), + legend: this._getLegendOptions(datasetsCount), + tooltips: this._getTooltipOptions(), + elements: this._getElementOptions(), + animation: this._getElementOptions(), + }; + if (this._isRedirectionEnabled()) { + options.onClick = this._onGraphClicked.bind(this); + } + return options; + }, + + _renderBarChart: function (dataPoints) { + var self = this; + + // prepare data + var data = this._prepareData(dataPoints); + + data.datasets.forEach(function (dataset, index) { + // used when stacked + dataset.stack = self.state.stacked ? self.state.origins[dataset.originIndex] : undefined; + // set dataset color + var color = self._getColor(index); + dataset.backgroundColor = color; + }); + + // prepare options + var options = this._prepareOptions(data.datasets.length); + console.log("rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr chart data>>>>>>>>>>>>>>>>", data) + console.log("rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr chart>>>>>>>>>>>>>>>>", options) + console.log("rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr chart>>>>>>>>>>>>>>>>", JSON.stringify(options)) + // create chart + var ctx = document.getElementById(this.chartId); + this.chart = new Chart(ctx, { + type: 'bar', + data: data, + options: options, + }); + }, + + }); +}); diff --git a/project_report/views/assets.xml b/project_report/views/assets.xml new file mode 100755 index 0000000..ac5abf2 --- /dev/null +++ b/project_report/views/assets.xml @@ -0,0 +1,10 @@ + + + +