Skip to content
Extraits de code Groupes Projets
Valider ac043bfe rédigé par Juliana's avatar Juliana
Parcourir les fichiers

[MIG] Migration 14.0

parent 73099f6e
Branches
Aucune étiquette associée trouvée
1 requête de fusion!114.0 sale overview
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
'summary': """Filament - Lien entre commandes et projets""", 'summary': """Filament - Lien entre commandes et projets""",
'author': "Le Filament", 'author': "Le Filament",
'website': "https://www.le-filament.com", 'website': "https://www.le-filament.com",
'version': '13.0.1.0.1', 'version': '14.0.1.0.1',
'license': "AGPL-3", 'license': "AGPL-3",
'category': 'Sale Management', 'category': 'Sale Management',
'depends': ['sale_timesheet', 'project'], 'depends': ['sale_timesheet', 'project'],
......
...@@ -30,12 +30,14 @@ class Project(models.Model): ...@@ -30,12 +30,14 @@ class Project(models.Model):
# ------------------------------------------------------ # ------------------------------------------------------
# CRUD methods (ORM overrides) # 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 """ """ return the header and the rows informations of the table """
if not self: if not self:
return False return False
uom_hour = self.env.ref('uom.product_uom_hour') 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 # build SQL query and fetch raw data
query, query_params = self._table_rows_sql_query() query, query_params = self._table_rows_sql_query()
...@@ -80,9 +82,11 @@ class Project(models.Model): ...@@ -80,9 +82,11 @@ class Project(models.Model):
# rows_sale_line[sale_line_row_key][-2] = sale_line.product_uom._compute_quantity( # 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 # 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(): for row_key, row_employee in rows_employee.items():
sale_line_id = row_key[1] sale_order_id, sale_line_id, employee_id = row_key
sale_order_id = row_key[0]
# sale line row # sale line row
sale_line_row_key = (sale_order_id, sale_line_id) sale_line_row_key = (sale_order_id, sale_line_id)
if sale_line_row_key not in rows_sale_line: if sale_line_row_key not in rows_sale_line:
...@@ -100,18 +104,19 @@ class Project(models.Model): ...@@ -100,18 +104,19 @@ class Project(models.Model):
# rows_sale_line[sale_line_row_key][-2] = sale_line.product_uom._compute_quantity( # 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 # 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 sale_line_row_key not in rows_sale_line_all_data:
if index != 0: rows_sale_line_all_data[sale_line_row_key] = [0] * len(row_employee)
rows_sale_line[sale_line_row_key][index] += rows_employee[row_key][index] 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'): 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][-1] = rows_sale_line[sale_line_row_key][-2] - \
rows_sale_line[sale_line_row_key][5] rows_sale_line_all_data[sale_line_row_key][5]
else: else:
rows_sale_line[sale_line_row_key][-1] = 0 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 = {} # 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(): for row_key, row_sale_line in rows_sale_line.items():
sale_order_id = row_key[0] sale_order_id = row_key[0]
# sale order row # sale order row
...@@ -122,19 +127,8 @@ class Project(models.Model): ...@@ -122,19 +127,8 @@ class Project(models.Model):
'type': 'sale_order'}] + default_row_vals[ 'type': 'sale_order'}] + default_row_vals[
:] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted :] # INFO, before, M1, M2, M3, Done, M3, M4, M5, After, Forecasted
for index in range(len(rows_sale_line[row_key])): for index in range(1, len(row_sale_line)):
if index != 0: rows_sale_order[sale_order_id][index] += row_sale_line[index]
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']
# group rows SO, SOL and their related employee rows. # group rows SO, SOL and their related employee rows.
timesheet_forecast_table_rows = [] timesheet_forecast_table_rows = []
...@@ -142,16 +136,25 @@ class Project(models.Model): ...@@ -142,16 +136,25 @@ class Project(models.Model):
timesheet_forecast_table_rows.append(sale_order_row) timesheet_forecast_table_rows.append(sale_order_row)
for sale_line_row_key, sale_line_row in rows_sale_line.items(): for sale_line_row_key, sale_line_row in rows_sale_line.items():
if sale_order_id == sale_line_row_key[0]: if sale_order_id == sale_line_row_key[0]:
sale_order_row[0]['has_children'] = True
timesheet_forecast_table_rows.append(sale_line_row) timesheet_forecast_table_rows.append(sale_line_row)
for employee_row_key, employee_row in rows_employee.items(): 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) 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 # complete table data
return { return {
'header': self._table_header(), 'header': self._table_header(),
'rows': timesheet_forecast_table_rows 'rows': timesheet_forecast_table_rows
} }
# ------------------------------------------------------ # ------------------------------------------------------
# Actions # Actions
# ------------------------------------------------------ # ------------------------------------------------------
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter