GoodERP
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

111 lines
6.5KB

  1. """2026-10-05:13 → 18 指定修复的回归用例,使用独立事务。"""
  2. from odoo.tests import tagged
  3. from odoo.tests.common import TransactionCase
  4. @tagged('post_install', '-at_install', 'port_13_18')
  5. class TestPortBuy(TransactionCase):
  6. def test_partial_and_serial_discounts(self):
  7. goods = self.env.ref('goods.mouse')
  8. goods.force_batch_one = False
  9. for kind in ('buy', 'return'):
  10. order = self.env['buy.order'].new({'type': kind})
  11. for quantity, done, expected in [(10, 0, 100), (10, 6, 40), (10, 9, 10), (10, 10, 0), (0, 0, 0)]:
  12. line = self.env['buy.order.line'].new({
  13. 'goods_id': goods.id, 'quantity': quantity, 'quantity_in': done,
  14. 'price': 100, 'price_taxed': 113, 'tax_rate': 13,
  15. 'discount_amount': 100,
  16. })
  17. vals = order.get_receipt_line(line)
  18. self.assertAlmostEqual(vals['discount_amount'], expected)
  19. self.assertEqual(vals['goods_qty'], quantity - done)
  20. if quantity:
  21. self.assertEqual(order.get_receipt_line(line, single=True)['discount_amount'], 10)
  22. # 三个实际批次累计折扣与原单一致,保留 18 含税总额算法。
  23. discounts = []
  24. for done, qty in [(0, 6), (6, 3), (9, 1)]:
  25. line = self.env['buy.order.line'].new({
  26. 'goods_id': goods.id, 'quantity': 10, 'quantity_in': done,
  27. 'price': 100, 'price_taxed': 113, 'tax_rate': 13, 'discount_amount': 100,
  28. })
  29. vals = order.get_receipt_line(line)
  30. # 模拟保存后的草稿行再改数量,按单价折扣分摊。
  31. origin = self.env['wh.move.line'].create(dict(vals, buy_line_id=False))
  32. edited = self.env['wh.move.line'].new(dict(vals, goods_qty=qty), origin=origin)
  33. edited.onchange_discount_rate()
  34. discounts.append(edited.discount_amount)
  35. self.assertAlmostEqual(edited.subtotal, 113 * qty - 10 * qty)
  36. self.assertAlmostEqual(edited.amount + edited.tax_amount, edited.subtotal)
  37. self.assertAlmostEqual(sum(discounts), 100)
  38. def test_fee_supplier_payment_terms_and_due_date(self):
  39. term_order = self.env['pay.method'].create({'name': 'PORT主单30天', 'add_days': 30})
  40. term_fee = self.env['pay.method'].create({'name': 'PORT费用7天', 'add_days': 7})
  41. partner = self.env.ref('core.lenovo')
  42. supplier = partner.copy({'name': 'PORT费用供应商', 'pay_method': term_fee.id})
  43. order = self.env['buy.order'].new({'partner_id': partner.id, 'pay_method': term_order.id})
  44. doc = self.env['buy.receipt'].new({'partner_id': partner.id, 'order_id': order})
  45. category = self.env.ref('money.core_category_purchase')
  46. from datetime import date, timedelta
  47. day = date(2026, 10, 5)
  48. for target, term in [(partner, term_order), (supplier, term_fee)]:
  49. vals = doc._get_invoice_vals(target, category, day, 106, 6)
  50. self.assertEqual(vals['pay_method'], term.id)
  51. vals.update(move_id=False, invoice_date=day)
  52. invoice = self.env['money.invoice'].create(vals)
  53. if invoice.state == 'draft':
  54. invoice.money_invoice_done()
  55. self.assertEqual(invoice.date_due, day + timedelta(days=term.add_days))
  56. supplier.pay_method = False
  57. self.assertFalse(doc._get_invoice_vals(supplier, category, day, 100, 0)['pay_method'])
  58. order.pay_method = False
  59. partner.pay_method = term_fee
  60. self.assertEqual(doc._get_invoice_vals(partner, category, day, 100, 0)['pay_method'], term_fee.id)
  61. def test_import_matches_exact_goods_name(self):
  62. goods = self.env.ref('goods.mouse').copy({'name': 'PORT-IMPORT', 'code': 'PORT-CODE'})
  63. self.env.ref('goods.mouse').copy({'name': 'PORT-other', 'code': 'PORT-IMPORT123'})
  64. order = self.env['buy.order'].with_context(warehouse_dest_type='stock').create({
  65. 'partner_id': self.env.ref('core.lenovo').id})
  66. result = self.env['buy.order.line'].load(
  67. ['order_id/.id', 'goods_id', 'uom_id/.id', 'quantity'],
  68. [[str(order.id), 'PORT-IMPORT', str(goods.uom_id.id), '2']])
  69. self.assertFalse(result['messages'], result['messages'])
  70. self.assertEqual(self.env['buy.order.line'].browse(result['ids']).goods_id, goods)
  71. def test_three_batch_confirmation_chain(self):
  72. self.env.user.groups_id |= self.env.ref('buy.group_buy')
  73. goods = self.env.ref('goods.keyboard').copy({'name': 'PORT分批buy', 'code': 'PORT-BATCH-buy',
  74. 'using_batch': False, 'force_batch_one': False})
  75. supplier = self.env.ref('core.lenovo')
  76. order = self.env['buy.order'].with_context(warehouse_dest_type='stock', warehouse_type='stock').create({
  77. 'partner_id': supplier.id,
  78. 'bank_account_id': False,
  79. 'line_ids': [(0, 0, {'goods_id': goods.id, 'uom_id': goods.uom_id.id, 'quantity': 10,
  80. 'price': 100, 'price_taxed': 113, 'tax_rate': 13, 'discount_rate': 0, 'discount_amount': 100})],
  81. })
  82. order.buy_order_done()
  83. discounts = []
  84. for qty in (6, 3, 1):
  85. pending = self.env['buy.receipt'].search([('order_id', '=', order.id), ('state', '=', 'draft')])
  86. if not pending:
  87. order.buy_generate_receipt()
  88. pending = self.env['buy.receipt'].search([('order_id', '=', order.id), ('state', '=', 'draft')])
  89. pending.ensure_one()
  90. line = pending.line_in_ids
  91. line.ensure_one()
  92. draft = self.env['wh.move.line'].new({
  93. 'goods_id': goods.id, 'goods_qty': qty, 'price': line.price, 'price_taxed': line.price_taxed,
  94. 'tax_rate': line.tax_rate, 'discount_rate': line.discount_rate, 'discount_amount': line.discount_amount,
  95. }, origin=line)
  96. draft.onchange_discount_rate()
  97. line.write({'goods_qty': qty, 'discount_amount': draft.discount_amount})
  98. self.assertAlmostEqual(line.subtotal, 103 * qty)
  99. pending.buy_receipt_done()
  100. self.assertEqual(pending.state, 'done')
  101. discounts.append(line.discount_amount)
  102. self.assertEqual(order.line_ids.quantity_in, 10)
  103. self.assertAlmostEqual(sum(discounts), 100)
  104. order.buy_generate_receipt()
  105. self.assertFalse(self.env['buy.receipt'].search([('order_id', '=', order.id), ('state', '=', 'draft')]))
上海开阖软件有限公司 沪ICP备12045867号-1