Bug From To

This commit is contained in:
2026-04-28 20:32:04 +02:00
parent debe374f1b
commit 062b42f83f
3 changed files with 100 additions and 17 deletions

View File

@@ -569,6 +569,35 @@ class Purchase(metaclass=PoolMeta):
if self.doc_template: if self.doc_template:
return self.doc_template.type return self.doc_template.type
@classmethod
def _check_lines_delivery_period_values(cls, values):
line_commands = values.get('lines') or []
if not line_commands:
return
Line = Pool().get('purchase.line')
for command in line_commands:
action = command[0]
if action == 'create':
for line_values in command[1]:
Line._check_delivery_period_values([Line()], line_values)
elif action == 'write':
actions = iter(command[1:])
for line_ids, line_values in zip(actions, actions):
lines = Line.browse(line_ids)
Line._check_delivery_period_values(lines, line_values)
elif action == 'add':
lines = Line.browse(command[1])
Line._check_delivery_period_values(lines)
@classmethod
def write(cls, *args):
actions = iter(args)
args = []
for purchases, values in zip(actions, actions):
cls._check_lines_delivery_period_values(values)
args.extend((purchases, values))
super().write(*args)
@classmethod @classmethod
def copy(cls, purchases, default=None): def copy(cls, purchases, default=None):
if default is None: if default is None:

View File

@@ -997,6 +997,35 @@ class Sale(metaclass=PoolMeta):
if self.lines.lots: if self.lines.lots:
return [l for l in self.lines.lots] return [l for l in self.lines.lots]
@classmethod
def _check_lines_delivery_period_values(cls, values):
line_commands = values.get('lines') or []
if not line_commands:
return
Line = Pool().get('sale.line')
for command in line_commands:
action = command[0]
if action == 'create':
for line_values in command[1]:
Line._check_delivery_period_values([Line()], line_values)
elif action == 'write':
actions = iter(command[1:])
for line_ids, line_values in zip(actions, actions):
lines = Line.browse(line_ids)
Line._check_delivery_period_values(lines, line_values)
elif action == 'add':
lines = Line.browse(command[1])
Line._check_delivery_period_values(lines)
@classmethod
def write(cls, *args):
actions = iter(args)
args = []
for sales, values in zip(actions, actions):
cls._check_lines_delivery_period_values(values)
args.extend((sales, values))
super().write(*args)
@classmethod @classmethod
def validate(cls, sales): def validate(cls, sales):
super(Sale, cls).validate(sales) super(Sale, cls).validate(sales)

View File

@@ -604,6 +604,31 @@ class PurchaseTradeTestCase(ModuleTestCase):
'quantity': Decimal('1'), 'quantity': Decimal('1'),
}) })
def test_sale_and_purchase_parent_write_check_embedded_line_commands(self):
'sale and purchase writes validate embedded one2many line commands'
Sale = Pool().get('sale.sale')
Purchase = Pool().get('purchase.purchase')
invalid = Mock(
from_del=datetime.date(2026, 4, 16),
to_del=datetime.date(2026, 4, 10),
)
with patch('trytond.modules.purchase_trade.sale.Pool') as SalePool:
SalePool.return_value.get.return_value = Mock(
browse=Mock(return_value=[invalid]))
with self.assertRaises(UserError):
Sale._check_lines_delivery_period_values({
'lines': [['write', [564], {'quantity': Decimal('1')}]],
})
with patch('trytond.modules.purchase_trade.purchase.Pool') as PurchasePool:
PurchasePool.return_value.get.return_value = Mock(
browse=Mock(return_value=[invalid]))
with self.assertRaises(UserError):
Purchase._check_lines_delivery_period_values({
'lines': [['add', [564]]],
})
def test_pricing_eod_uses_weighted_average_for_manual_rows(self): def test_pricing_eod_uses_weighted_average_for_manual_rows(self):
'manual pricing eod uses the weighted average of fixed and unfixed legs' 'manual pricing eod uses the weighted average of fixed and unfixed legs'
Pricing = Pool().get('pricing.pricing') Pricing = Pool().get('pricing.pricing')