diff --git a/addons/sale_timesheet/models/sale_order.py b/addons/sale_timesheet/models/sale_order.py index 5d16f85201a..c2d5ed1a8ea 100644 --- a/addons/sale_timesheet/models/sale_order.py +++ b/addons/sale_timesheet/models/sale_order.py @@ -2,10 +2,11 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import math +from collections import defaultdict from odoo import api, fields, models, _ from odoo.osv import expression -from odoo.tools import float_compare +from odoo.tools import float_compare, format_amount class SaleOrder(models.Model): @@ -134,41 +135,61 @@ class SaleOrderLine(models.Model): def name_get(self): res = super(SaleOrderLine, self).name_get() - if self.env.context.get('with_remaining_hours'): + with_remaining_hours = self.env.context.get('with_remaining_hours') + with_price_unit = self.env.context.get('with_price_unit') + if with_remaining_hours or with_price_unit: names = dict(res) result = [] - uom_hour = self.env.ref('uom.product_uom_hour') - uom_day = self.env.ref('uom.product_uom_day') + uom_hour = with_remaining_hours and self.env.ref('uom.product_uom_hour') + uom_day = with_remaining_hours and self.env.ref('uom.product_uom_day') + sols_by_so_dict = with_price_unit and defaultdict(lambda: self.env[self._name]) # key: (sale_order_id, product_id), value: sale order line for line in self: - name = names.get(line.id) - if line.remaining_hours_available: - company = self.env.company - encoding_uom = company.timesheet_encode_uom_id - remaining_time = '' - if encoding_uom == uom_hour: - hours, minutes = divmod(abs(line.remaining_hours) * 60, 60) - round_minutes = minutes / 30 - minutes = math.ceil(round_minutes) if line.remaining_hours >= 0 else math.floor(round_minutes) - if minutes > 1: - minutes = 0 - hours += 1 - else: - minutes = minutes * 30 - remaining_time = ' ({sign}{hours:02.0f}:{minutes:02.0f})'.format( - sign='-' if line.remaining_hours < 0 else '', - hours=hours, - minutes=minutes) - elif encoding_uom == uom_day: - remaining_days = company.project_time_mode_id._compute_quantity(line.remaining_hours, encoding_uom, round=False) - remaining_time = ' ({qty:.02f} {unit})'.format( - qty=remaining_days, - unit=_('days') if abs(remaining_days) > 1 else _('day') + if with_remaining_hours: + name = names.get(line.id) + if line.remaining_hours_available: + company = self.env.company + encoding_uom = company.timesheet_encode_uom_id + remaining_time = '' + if encoding_uom == uom_hour: + hours, minutes = divmod(abs(line.remaining_hours) * 60, 60) + round_minutes = minutes / 30 + minutes = math.ceil(round_minutes) if line.remaining_hours >= 0 else math.floor(round_minutes) + if minutes > 1: + minutes = 0 + hours += 1 + else: + minutes = minutes * 30 + remaining_time = ' ({sign}{hours:02.0f}:{minutes:02.0f})'.format( + sign='-' if line.remaining_hours < 0 else '', + hours=hours, + minutes=minutes) + elif encoding_uom == uom_day: + remaining_days = company.project_time_mode_id._compute_quantity(line.remaining_hours, encoding_uom, round=False) + remaining_time = ' ({qty:.02f} {unit})'.format( + qty=remaining_days, + unit=_('days') if abs(remaining_days) > 1 else _('day') + ) + name = '{name}{remaining_time}'.format( + name=name, + remaining_time=remaining_time ) - name = '{name}{remaining_time}'.format( - name=name, - remaining_time=remaining_time - ) - result.append((line.id, name)) + if with_price_unit: + names[line.id] = name + if not with_price_unit: + result.append((line.id, name)) + if with_price_unit: + sols_by_so_dict[line.order_id.id, line.product_id.id] += line + + if with_price_unit: + for sols in sols_by_so_dict.values(): + if len(sols) > 1: + result += [( + line.id, + '%s - %s' % ( + names.get(line.id), format_amount(self.env, line.price_unit, line.currency_id)) + ) for line in sols] + else: + result.append((sols.id, names.get(sols.id))) return result return res diff --git a/addons/sale_timesheet/views/project_task_views.xml b/addons/sale_timesheet/views/project_task_views.xml index 1fd2d48ca61..bde6ee3ff92 100644 --- a/addons/sale_timesheet/views/project_task_views.xml +++ b/addons/sale_timesheet/views/project_task_views.xml @@ -153,7 +153,7 @@ @@ -192,7 +192,7 @@ - {'with_remaining_hours': True} + {'with_remaining_hours': True, 'with_price_unit': True} {'invisible': ['|', ('allow_billable', '=', False), ('partner_id', '=', False)]}