ICT bulk
This commit is contained in:
@@ -253,8 +253,12 @@ class Sale(metaclass=PoolMeta):
|
||||
'sale',
|
||||
'Analytic Dimensions'
|
||||
)
|
||||
trader = fields.Many2One('party.party',"Trader")
|
||||
operator = fields.Many2One('party.party',"Operator")
|
||||
trader = fields.Many2One(
|
||||
'party.party', "Trader",
|
||||
domain=[('categories.name', '=', 'TRADER')])
|
||||
operator = fields.Many2One(
|
||||
'party.party', "Operator",
|
||||
domain=[('categories.name', '=', 'OPERATOR')])
|
||||
our_reference = fields.Char("Our Reference")
|
||||
company_visible = fields.Function(
|
||||
fields.Boolean("Visible"), 'on_change_with_company_visible')
|
||||
@@ -395,6 +399,76 @@ class Sale(metaclass=PoolMeta):
|
||||
if line:
|
||||
return line.note
|
||||
return ''
|
||||
|
||||
@staticmethod
|
||||
def _get_report_line_lots(line):
|
||||
return list(getattr(line, 'lots', []) or [])
|
||||
|
||||
@classmethod
|
||||
def _get_report_preferred_lots(cls, line):
|
||||
lots = cls._get_report_line_lots(line)
|
||||
physicals = [
|
||||
lot for lot in lots
|
||||
if getattr(lot, 'lot_type', None) == 'physic'
|
||||
]
|
||||
if physicals:
|
||||
return physicals
|
||||
virtuals = [
|
||||
lot for lot in lots
|
||||
if getattr(lot, 'lot_type', None) == 'virtual'
|
||||
]
|
||||
if len(virtuals) == 1:
|
||||
return virtuals
|
||||
return []
|
||||
|
||||
@staticmethod
|
||||
def _get_report_lot_hist_weights(lot):
|
||||
if not lot:
|
||||
return None, None
|
||||
if hasattr(lot, 'get_hist_quantity'):
|
||||
net, gross = lot.get_hist_quantity()
|
||||
return (
|
||||
Decimal(str(net or 0)),
|
||||
Decimal(str(gross if gross not in (None, '') else net or 0)),
|
||||
)
|
||||
hist = list(getattr(lot, 'lot_hist', []) or [])
|
||||
state = getattr(lot, 'lot_state', None)
|
||||
state_id = getattr(state, 'id', None)
|
||||
if state_id is not None:
|
||||
for entry in hist:
|
||||
quantity_type = getattr(entry, 'quantity_type', None)
|
||||
if getattr(quantity_type, 'id', None) == state_id:
|
||||
net = Decimal(str(getattr(entry, 'quantity', 0) or 0))
|
||||
gross = Decimal(str(
|
||||
getattr(entry, 'gross_quantity', None)
|
||||
if getattr(entry, 'gross_quantity', None) not in (None, '')
|
||||
else net))
|
||||
return net, gross
|
||||
return None, None
|
||||
|
||||
@classmethod
|
||||
def _get_report_line_weights(cls, line):
|
||||
lots = cls._get_report_preferred_lots(line)
|
||||
if lots:
|
||||
net_total = Decimal(0)
|
||||
gross_total = Decimal(0)
|
||||
for lot in lots:
|
||||
net, gross = cls._get_report_lot_hist_weights(lot)
|
||||
if net is None:
|
||||
continue
|
||||
net_total += net
|
||||
gross_total += gross
|
||||
if net_total or gross_total:
|
||||
return net_total, gross_total
|
||||
quantity = Decimal(str(getattr(line, 'quantity', 0) or 0))
|
||||
return quantity, quantity
|
||||
|
||||
@classmethod
|
||||
def _get_report_line_unit(cls, line):
|
||||
lots = cls._get_report_preferred_lots(line)
|
||||
if lots and getattr(lots[0], 'lot_unit_line', None):
|
||||
return lots[0].lot_unit_line
|
||||
return getattr(line, 'unit', None)
|
||||
|
||||
@property
|
||||
def report_gross(self):
|
||||
@@ -402,12 +476,7 @@ class Sale(metaclass=PoolMeta):
|
||||
if lines:
|
||||
total = Decimal(0)
|
||||
for line in lines:
|
||||
phys_lots = [l for l in line.lots if l.lot_type == 'physic']
|
||||
if phys_lots:
|
||||
total += sum(Decimal(str(l.get_current_gross_quantity() or 0))
|
||||
for l in phys_lots)
|
||||
else:
|
||||
total += Decimal(str(line.quantity or 0))
|
||||
total += self._get_report_line_weights(line)[1]
|
||||
return total
|
||||
return ''
|
||||
|
||||
@@ -417,12 +486,7 @@ class Sale(metaclass=PoolMeta):
|
||||
if lines:
|
||||
total = Decimal(0)
|
||||
for line in lines:
|
||||
phys_lots = [l for l in line.lots if l.lot_type == 'physic']
|
||||
if phys_lots:
|
||||
total += sum(Decimal(str(l.get_current_quantity() or 0))
|
||||
for l in phys_lots)
|
||||
else:
|
||||
total += Decimal(str(line.quantity or 0))
|
||||
total += self._get_report_line_weights(line)[0]
|
||||
return total
|
||||
return ''
|
||||
|
||||
@@ -430,23 +494,20 @@ class Sale(metaclass=PoolMeta):
|
||||
def report_total_quantity(self):
|
||||
lines = self._get_report_lines()
|
||||
if lines:
|
||||
total = sum(Decimal(str(line.quantity or 0)) for line in lines)
|
||||
total = sum(self._get_report_line_weights(line)[0] for line in lines)
|
||||
return self._format_report_number(total, keep_trailing_decimal=True)
|
||||
return '0.0'
|
||||
|
||||
@property
|
||||
def report_quantity_unit_upper(self):
|
||||
line = self._get_report_first_line()
|
||||
if line and line.unit:
|
||||
return line.unit.rec_name.upper()
|
||||
unit = self._get_report_line_unit(line) if line else None
|
||||
if unit and unit.rec_name:
|
||||
return unit.rec_name.upper()
|
||||
return ''
|
||||
|
||||
def _get_report_line_quantity(self, line):
|
||||
phys_lots = [l for l in line.lots if l.lot_type == 'physic']
|
||||
if phys_lots:
|
||||
return sum(Decimal(str(l.get_current_quantity() or 0))
|
||||
for l in phys_lots)
|
||||
return Decimal(str(line.quantity or 0))
|
||||
return self._get_report_line_weights(line)[0]
|
||||
|
||||
@property
|
||||
def report_qt(self):
|
||||
@@ -466,7 +527,11 @@ class Sale(metaclass=PoolMeta):
|
||||
current_quantity = self._get_report_line_quantity(line)
|
||||
quantity = self._format_report_number(
|
||||
current_quantity, keep_trailing_decimal=True)
|
||||
unit = line.unit.rec_name.upper() if line.unit and line.unit.rec_name else ''
|
||||
line_unit = self._get_report_line_unit(line)
|
||||
unit = (
|
||||
line_unit.rec_name.upper()
|
||||
if line_unit and line_unit.rec_name else ''
|
||||
)
|
||||
words = quantity_to_words(current_quantity)
|
||||
period = line.del_period.description if getattr(line, 'del_period', None) else ''
|
||||
detail = ' '.join(
|
||||
|
||||
Reference in New Issue
Block a user