|
- """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 TestPortBuy(TransactionCase):
- def test_partial_and_serial_discounts(self):
- goods = self.env.ref('goods.mouse')
- goods.force_batch_one = False
- for kind in ('buy', 'return'):
- order = self.env['buy.order'].new({'type': kind})
- for quantity, done, expected in [(10, 0, 100), (10, 6, 40), (10, 9, 10), (10, 10, 0), (0, 0, 0)]:
- line = self.env['buy.order.line'].new({
- 'goods_id': goods.id, 'quantity': quantity, 'quantity_in': done,
- 'price': 100, 'price_taxed': 113, 'tax_rate': 13,
- 'discount_amount': 100,
- })
- vals = order.get_receipt_line(line)
- self.assertAlmostEqual(vals['discount_amount'], expected)
- self.assertEqual(vals['goods_qty'], quantity - done)
- if quantity:
- self.assertEqual(order.get_receipt_line(line, single=True)['discount_amount'], 10)
- # 三个实际批次累计折扣与原单一致,保留 18 含税总额算法。
- discounts = []
- for done, qty in [(0, 6), (6, 3), (9, 1)]:
- line = self.env['buy.order.line'].new({
- 'goods_id': goods.id, 'quantity': 10, 'quantity_in': done,
- 'price': 100, 'price_taxed': 113, 'tax_rate': 13, 'discount_amount': 100,
- })
- vals = order.get_receipt_line(line)
- # 模拟保存后的草稿行再改数量,按单价折扣分摊。
- origin = self.env['wh.move.line'].create(dict(vals, buy_line_id=False))
- edited = self.env['wh.move.line'].new(dict(vals, goods_qty=qty), origin=origin)
- edited.onchange_discount_rate()
- discounts.append(edited.discount_amount)
- self.assertAlmostEqual(edited.subtotal, 113 * qty - 10 * qty)
- self.assertAlmostEqual(edited.amount + edited.tax_amount, edited.subtotal)
- self.assertAlmostEqual(sum(discounts), 100)
-
- def test_fee_supplier_payment_terms_and_due_date(self):
- term_order = self.env['pay.method'].create({'name': 'PORT主单30天', 'add_days': 30})
- term_fee = self.env['pay.method'].create({'name': 'PORT费用7天', 'add_days': 7})
- partner = self.env.ref('core.lenovo')
- supplier = partner.copy({'name': 'PORT费用供应商', 'pay_method': term_fee.id})
- order = self.env['buy.order'].new({'partner_id': partner.id, 'pay_method': term_order.id})
- doc = self.env['buy.receipt'].new({'partner_id': partner.id, 'order_id': order})
- category = self.env.ref('money.core_category_purchase')
- from datetime import date, timedelta
- day = date(2026, 10, 5)
- for target, term in [(partner, term_order), (supplier, term_fee)]:
- vals = doc._get_invoice_vals(target, category, day, 106, 6)
- self.assertEqual(vals['pay_method'], term.id)
- vals.update(move_id=False, invoice_date=day)
- invoice = self.env['money.invoice'].create(vals)
- if invoice.state == 'draft':
- invoice.money_invoice_done()
- self.assertEqual(invoice.date_due, day + timedelta(days=term.add_days))
- supplier.pay_method = False
- self.assertFalse(doc._get_invoice_vals(supplier, category, day, 100, 0)['pay_method'])
- order.pay_method = False
- partner.pay_method = term_fee
- self.assertEqual(doc._get_invoice_vals(partner, category, day, 100, 0)['pay_method'], term_fee.id)
-
- def test_import_matches_exact_goods_name(self):
- goods = self.env.ref('goods.mouse').copy({'name': 'PORT-IMPORT', 'code': 'PORT-CODE'})
- self.env.ref('goods.mouse').copy({'name': 'PORT-other', 'code': 'PORT-IMPORT123'})
- order = self.env['buy.order'].with_context(warehouse_dest_type='stock').create({
- 'partner_id': self.env.ref('core.lenovo').id})
- result = self.env['buy.order.line'].load(
- ['order_id/.id', 'goods_id', 'uom_id/.id', 'quantity'],
- [[str(order.id), 'PORT-IMPORT', str(goods.uom_id.id), '2']])
- self.assertFalse(result['messages'], result['messages'])
- self.assertEqual(self.env['buy.order.line'].browse(result['ids']).goods_id, goods)
-
- def test_three_batch_confirmation_chain(self):
- self.env.user.groups_id |= self.env.ref('buy.group_buy')
- goods = self.env.ref('goods.keyboard').copy({'name': 'PORT分批buy', 'code': 'PORT-BATCH-buy',
- 'using_batch': False, 'force_batch_one': False})
- supplier = self.env.ref('core.lenovo')
- order = self.env['buy.order'].with_context(warehouse_dest_type='stock', warehouse_type='stock').create({
- 'partner_id': supplier.id,
- 'bank_account_id': False,
- 'line_ids': [(0, 0, {'goods_id': goods.id, 'uom_id': goods.uom_id.id, 'quantity': 10,
- 'price': 100, 'price_taxed': 113, 'tax_rate': 13, 'discount_rate': 0, 'discount_amount': 100})],
- })
- order.buy_order_done()
- discounts = []
- for qty in (6, 3, 1):
- pending = self.env['buy.receipt'].search([('order_id', '=', order.id), ('state', '=', 'draft')])
- if not pending:
- order.buy_generate_receipt()
- pending = self.env['buy.receipt'].search([('order_id', '=', order.id), ('state', '=', 'draft')])
- pending.ensure_one()
- line = pending.line_in_ids
- line.ensure_one()
- draft = self.env['wh.move.line'].new({
- 'goods_id': goods.id, 'goods_qty': qty, 'price': line.price, 'price_taxed': line.price_taxed,
- 'tax_rate': line.tax_rate, 'discount_rate': line.discount_rate, 'discount_amount': line.discount_amount,
- }, origin=line)
- draft.onchange_discount_rate()
- line.write({'goods_qty': qty, 'discount_amount': draft.discount_amount})
- self.assertAlmostEqual(line.subtotal, 103 * qty)
- pending.buy_receipt_done()
- self.assertEqual(pending.state, 'done')
- discounts.append(line.discount_amount)
- self.assertEqual(order.line_ids.quantity_in, 10)
- self.assertAlmostEqual(sum(discounts), 100)
- order.buy_generate_receipt()
- self.assertFalse(self.env['buy.receipt'].search([('order_id', '=', order.id), ('state', '=', 'draft')]))
|