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