From ac043bfedd31acc6870b5207229088e3aefbd53f Mon Sep 17 00:00:00 2001 From: Juliana <juliana@le-filament.com> Date: Tue, 17 Aug 2021 12:07:50 +0200 Subject: [PATCH] [MIG] Migration 14.0 --- __manifest__.py | 2 +- models/project_overview.py | 57 ++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/__manifest__.py b/__manifest__.py index fea4a3c..b3421a0 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -3,7 +3,7 @@ 'summary': """Filament - Lien entre commandes et projets""", 'author': "Le Filament", 'website': "https://www.le-filament.com", - 'version': '13.0.1.0.1', + 'version': '14.0.1.0.1', 'license': "AGPL-3", 'category': 'Sale Management', 'depends': ['sale_timesheet', 'project'], diff --git a/models/project_overview.py b/models/project_overview.py index fe1dcde..f387b51 100644 --- a/models/project_overview.py +++ b/models/project_overview.py @@ -30,12 +30,14 @@ class Project(models.Model): # ------------------------------------------------------ # CRUD methods (ORM overrides) # ------------------------------------------------------ - def _table_get_line_values(self): + def _table_get_line_values(self, employees=None): """ return the header and the rows informations of the table """ if not self: return False uom_hour = self.env.ref('uom.product_uom_hour') + company_uom = self.env.company.timesheet_encode_uom_id + is_uom_day = company_uom and company_uom == self.env.ref('uom.product_uom_day') # build SQL query and fetch raw data query, query_params = self._table_rows_sql_query() @@ -80,9 +82,11 @@ class Project(models.Model): # rows_sale_line[sale_line_row_key][-2] = sale_line.product_uom._compute_quantity( # sale_line.product_uom_qty, uom_hour, raise_if_failure=False) if sale_line else 0.0 + rows_sale_line_all_data = {} + if not employees: + employees = self.env['hr.employee'].sudo().search(self.env['account.analytic.line']._domain_employee_id()) for row_key, row_employee in rows_employee.items(): - sale_line_id = row_key[1] - sale_order_id = row_key[0] + sale_order_id, sale_line_id, employee_id = row_key # sale line row sale_line_row_key = (sale_order_id, sale_line_id) if sale_line_row_key not in rows_sale_line: @@ -100,18 +104,19 @@ class Project(models.Model): # rows_sale_line[sale_line_row_key][-2] = sale_line.product_uom._compute_quantity( # sale_line.product_uom_qty, uom_hour, raise_if_failure=False) if sale_line else 0.0 - for index in range(len(rows_employee[row_key])): - if index != 0: - rows_sale_line[sale_line_row_key][index] += rows_employee[row_key][index] - if not rows_sale_line[sale_line_row_key][0].get('is_milestone'): - rows_sale_line[sale_line_row_key][-1] = rows_sale_line[sale_line_row_key][-2] - \ - rows_sale_line[sale_line_row_key][5] - else: - rows_sale_line[sale_line_row_key][-1] = 0 + if sale_line_row_key not in rows_sale_line_all_data: + rows_sale_line_all_data[sale_line_row_key] = [0] * len(row_employee) + for index in range(1, len(row_employee)): + if employee_id in employees.ids: + rows_sale_line[sale_line_row_key][index] += row_employee[index] + rows_sale_line_all_data[sale_line_row_key][index] += row_employee[index] + if not rows_sale_line[sale_line_row_key][0].get('is_milestone'): + rows_sale_line[sale_line_row_key][-1] = rows_sale_line[sale_line_row_key][-2] - \ + rows_sale_line_all_data[sale_line_row_key][5] + else: + rows_sale_line[sale_line_row_key][-1] = 0 rows_sale_order = {} # so -> [INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted] - rows_sale_order_done_sold = {key: dict(sold=0.0, done=0.0) for key in - set(map_sol_so.values()) | set([None])} # SO id -> {'sold':0.0, 'done': 0.0} for row_key, row_sale_line in rows_sale_line.items(): sale_order_id = row_key[0] # sale order row @@ -122,19 +127,8 @@ class Project(models.Model): 'type': 'sale_order'}] + default_row_vals[ :] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted - for index in range(len(rows_sale_line[row_key])): - if index != 0: - rows_sale_order[sale_order_id][index] += rows_sale_line[row_key][index] - - # do not sum the milestone SO line for sold and done (for remaining computation) - if not rows_sale_line[row_key][0].get('is_milestone'): - rows_sale_order_done_sold[sale_order_id]['sold'] += rows_sale_line[row_key][-2] - rows_sale_order_done_sold[sale_order_id]['done'] += rows_sale_line[row_key][5] - - # remaining computation of SO row, as Sold - Done (timesheet total) - for sale_order_id, done_sold_vals in rows_sale_order_done_sold.items(): - if sale_order_id in rows_sale_order: - rows_sale_order[sale_order_id][-1] = done_sold_vals['sold'] - done_sold_vals['done'] + for index in range(1, len(row_sale_line)): + rows_sale_order[sale_order_id][index] += row_sale_line[index] # group rows SO, SOL and their related employee rows. timesheet_forecast_table_rows = [] @@ -142,16 +136,25 @@ class Project(models.Model): timesheet_forecast_table_rows.append(sale_order_row) for sale_line_row_key, sale_line_row in rows_sale_line.items(): if sale_order_id == sale_line_row_key[0]: + sale_order_row[0]['has_children'] = True timesheet_forecast_table_rows.append(sale_line_row) for employee_row_key, employee_row in rows_employee.items(): - if sale_order_id == employee_row_key[0] and sale_line_row_key[1] == employee_row_key[1]: + if sale_order_id == employee_row_key[0] and sale_line_row_key[1] == employee_row_key[1] and \ + employee_row_key[2] in employees.ids: + sale_line_row[0]['has_children'] = True timesheet_forecast_table_rows.append(employee_row) + if is_uom_day: + # convert all values from hours to days + for row in timesheet_forecast_table_rows: + for index in range(1, len(row)): + row[index] = round(uom_hour._compute_quantity(row[index], company_uom, raise_if_failure=False), 2) # complete table data return { 'header': self._table_header(), 'rows': timesheet_forecast_table_rows } + # ------------------------------------------------------ # Actions # ------------------------------------------------------ -- GitLab