|
- """2026-10-05:13 → 18 指定修复的回归用例,使用独立事务。"""
- from odoo.tests import tagged
- from odoo.tests.common import TransactionCase
-
-
- @tagged('post_install', '-at_install', 'port_13_18')
- class TestPortWarehouse(TransactionCase):
- def _line(self, **values):
- vals = {'type': 'out', 'goods_id': self.env.ref('goods.mouse').id, 'goods_qty': 10,
- 'price': 100, 'price_taxed': 113, 'tax_rate': 13,
- 'discount_amount': 100, 'discount_rate': 0}
- vals.update(values)
- return self.env['wh.move.line'].new(vals)
-
- def test_unsaved_manual_discount_survives(self):
- line = self._line(goods_qty=4, discount_amount=40)
- line.onchange_discount_rate()
- self.assertEqual(line.discount_amount, 40)
- self.assertAlmostEqual(line.subtotal, 412)
-
- def test_saved_manual_discount_quantity_zero_and_return(self):
- self.env.ref('goods.mouse').force_batch_one = False
- original = self._line()
- origin = self.env['wh.move.line'].create(original._convert_to_write(original._cache))
- for qty in (4, 0, -2):
- line = self.env['wh.move.line'].new({
- 'goods_qty': qty, 'price': 100, 'price_taxed': 113,
- 'goods_id': origin.goods_id.id, 'tax_rate': 13,
- 'discount_rate': 0, 'discount_amount': 100,
- }, origin=origin)
- line.onchange_discount_rate()
- self.assertAlmostEqual(line.discount_amount, 10 * qty)
-
- def test_rate_discount(self):
- line = self._line(goods_qty=4, discount_rate=10)
- line.onchange_discount_rate()
- self.assertEqual(line.discount_amount, 40)
-
- def test_clear_rate_cancels_discount(self):
- line = self._line(discount_rate=0)
- # 执行实际注册的 rate onchange,而不是调用待新增方法。
- for method in line._onchange_methods['discount_rate']:
- method(line)
- self.assertEqual(line.discount_amount, 0)
-
- def _stock(self):
- stock = self.env.ref('warehouse.hd_stock')
- supplier = self.env.ref('warehouse.warehouse_supplier')
- move = self.env['wh.move'].create({'origin': 'wh.in.others',
- 'warehouse_id': supplier.id, 'warehouse_dest_id': stock.id})
- goods_ids = []
- for mark in (True, False, None):
- goods = self.env.ref('goods.mouse').copy({'name': 'PORT库存%s' % mark, 'code': 'PORT%s' % mark,
- 'no_stock': bool(mark), 'force_batch_one': False})
- self.env['wh.move.line'].create({'move_id': move.id, 'type': 'in',
- 'goods_id': goods.id, 'goods_qty': 5, 'price': 10, 'cost_unit': 10,
- 'state': 'done', 'date': '2026-10-01'})
- goods_ids.append(goods.id)
- self.env.flush_all()
- self.env.cr.execute('UPDATE goods SET no_stock = NULL WHERE id = %s', [goods_ids[2]])
- self.env['goods'].invalidate_model(['no_stock'])
- return stock, goods_ids
-
- def test_inventory_true_false_null(self):
- stock, ids = self._stock()
- inv = self.env['wh.inventory'].create({'warehouse_id': stock.id, 'goods': [(6, 0, ids)]})
- rows = inv.get_line_detail()
- self.assertEqual({row['goods_id'] for row in rows}, set(ids[1:]))
- self.assertEqual(sum(row['qty'] for row in rows), 10)
-
- def test_ageing_true_false_null(self):
- stock, ids = self._stock()
- wizard = self.env['non.active.report.wizard'].create({'warehouse_id': stock.id,
- 'first_stage_day': 30, 'second_stage_day': 60, 'third_stage_day': 90})
- action = wizard.open_non_active_report()
- records = self.env['non.active.report'].search(action['domain']).filtered(lambda r: r.goods_id.id in ids)
- self.assertEqual(set(records.goods_id.ids), set(ids[1:]))
- self.assertEqual(sum(records.mapped('subtotal')), 10)
-
- def test_new_manual_discount_on_previously_undiscounted_line(self):
- self.env.ref('goods.mouse').force_batch_one = False
- line = self._line(discount_amount=0)
- origin = self.env['wh.move.line'].create(line._convert_to_write(line._cache))
- edited = self.env['wh.move.line'].new({'goods_id': origin.goods_id.id,
- 'goods_qty': 4, 'price_taxed': 113, 'tax_rate': 13, 'discount_amount': 40}, origin=origin)
- edited.onchange_discount_rate()
- self.assertEqual(edited.discount_amount, 40)
-
- def test_cleared_rate_does_not_return_on_quantity_change(self):
- self.env.ref('goods.mouse').force_batch_one = False
- line = self._line(discount_rate=10)
- origin = self.env['wh.move.line'].create(line._convert_to_write(line._cache))
- edited = self.env['wh.move.line'].new({'goods_id': origin.goods_id.id,
- 'goods_qty': 4, 'price_taxed': 113, 'tax_rate': 13,
- 'discount_rate': 0, 'discount_amount': 0}, origin=origin)
- edited.onchange_discount_rate()
- self.assertEqual(edited.discount_amount, 0)
-
- def test_form_onchange_sequence(self):
- from odoo.tests import Form
- self.env.ref('goods.mouse').force_batch_one = False
- view = self.env['ir.ui.view'].create({'name': 'port.discount.form', 'model': 'wh.move.line',
- 'arch': '''<form><field name="type"/><field name="goods_id"/>
- <field name="goods_qty"/><field name="price"/><field name="price_taxed"/>
- <field name="tax_rate"/><field name="discount_rate"/><field name="discount_amount"/>
- <field name="subtotal"/><field name="amount"/><field name="tax_amount"/></form>'''})
- line = self._line()
- original = self.env['wh.move.line'].create(line._convert_to_write(line._cache))
- form = Form(original, view=view)
- form.goods_qty = 4
- self.assertEqual(form.discount_amount, 40)
- self.assertAlmostEqual(form.subtotal, 412)
- form.discount_rate = 5
- self.assertEqual(form.discount_amount, 20)
- form.discount_rate = 0
- self.assertEqual(form.discount_amount, 0)
- form.goods_qty = 3
- self.assertEqual(form.discount_amount, 0)
- form.save()
-
- def test_form_unsaved_amount_and_zero_quantity(self):
- from odoo.tests import Form
- view = self.env['ir.ui.view'].create({'name': 'port.new.discount.form', 'model': 'wh.move.line',
- 'arch': '''<form><field name="type"/><field name="goods_id"/>
- <field name="goods_qty"/><field name="price"/><field name="price_taxed"/>
- <field name="tax_rate"/><field name="discount_rate"/><field name="discount_amount"/>
- <field name="subtotal"/></form>'''})
- form = Form(self.env['wh.move.line'].with_context(default_type='out'), view=view)
- form.goods_id = self.env.ref('goods.mouse')
- form.goods_qty = 4
- form.price_taxed = 100
- form.discount_amount = 40
- form.goods_qty = 3
- self.assertEqual(form.discount_amount, 40)
- form.discount_rate = 10
- form.discount_rate = 0
- form.goods_qty = 0
- self.assertEqual(form.discount_amount, 0)
|