|
- from odoo.tests.common import TransactionCase
- from odoo.exceptions import UserError
- import time
- import logging
-
- _logger = logging.getLogger(__name__)
-
-
- class TestInventory(TransactionCase):
- def setUp(self):
- super(TestInventory, self).setUp()
-
- self.env.ref('core.goods_category_1').account_id = self.env.ref(
- 'finance.account_goods').id
- self.env.ref('warehouse.wh_in_whin1').date = '2016-02-06'
- self.env.ref('warehouse.wh_in_whin3').date = '2016-02-06'
-
- self.others_in = self.browse_ref('warehouse.wh_in_whin1')
- self.others_in_2 = self.browse_ref('warehouse.wh_in_whin3')
-
- self.goods_mouse = self.browse_ref('goods.mouse')
- self.sh_warehouse = self.browse_ref('warehouse.sh_stock')
-
- # 创建一个临时的一个库存调拨,将1个商品调拨到上海仓库
- self.temp_mouse_in = self.env['wh.move.line'].with_context({
- 'type': 'in',
- }).create({
- 'move_id': self.others_in.move_id.id,
- 'goods_id': self.goods_mouse.id,
- 'uom_id': self.goods_mouse.uom_id.id,
- 'uos_id': self.goods_mouse.uos_id.id,
- 'warehouse_dest_id': self.sh_warehouse.id,
- 'goods_qty': 1,
- 'goods_uos_qty': self.goods_mouse.anti_conversion_unit(1),
- 'cost_unit': 30,
- 'lot': 'MOUSE0001',
- })
-
- # 商品 实际数量 实际辅助数量
- # 键鼠套装 96 2
- # 鼠标 1 1
- # 网线 48 1
- self.temp_mouse_in.location_id = self.env.ref('warehouse.b001_location').id
- self.others_in.approve_order()
- self.others_in_2.approve_order()
- self.temp_mouse_in.action_done()
- # 创建一个临时的库存调拨,此时数量为0,但是辅助数量为1
- self.temp_mouse_in_zero_qty = self.env['wh.move.line'].with_context({
- 'type': 'in',
- }).create({
- 'move_id': self.others_in.move_id.id,
- 'goods_id': self.goods_mouse.id,
- 'uom_id': self.goods_mouse.uom_id.id,
- 'uos_id': self.goods_mouse.uos_id.id,
- 'warehouse_dest_id': self.sh_warehouse.id,
- 'location_id':self.temp_mouse_in.location_id.id,
- 'goods_qty': 0,
- 'goods_uos_qty': 0,
- 'cost_unit': 30,
- 'lot': 'MOUSE0002',
- })
-
- self.temp_mouse_in_zero_qty.action_done()
-
- ''' odoo13 必须在这里read一下后面sql才能取到数据 '''
- for _l in self.env['wh.move.line'].search([('state', '=', 'done')]):
- _logger.info('%s %s +%s' % (
- _l.goods_id.name, _l.warehouse_dest_id.name, _l.goods_qty))
-
- self.inventory = self.env['wh.inventory'].create({
- 'warehouse_id': self.browse_ref('warehouse.hd_stock').id,
- })
- self.inventory.query_inventory()
-
-
- def test_query_inventory(self):
- # 盘点单查询的结果必须和每个商品单据查询的结果一致
- for line in self.inventory.line_ids:
- goods_stock = line.goods_id.get_stock_qty()[0]
- self.assertEqual(goods_stock.get('warehouse'),
- line.warehouse_id.name)
- if line.goods_id.name == '网线': # 网线在途移库 120个,盘点时应减去
- self.assertEqual(goods_stock.get('qty') - 120, line.real_qty)
- else:
- self.assertEqual(goods_stock.get('qty'), line.real_qty)
-
- # 当指定仓库的时候,选择的行必须是该仓库的
- self.inventory.warehouse_id = self.sh_warehouse
- self.inventory.query_inventory()
- for line in self.inventory.line_ids:
- self.assertEqual(line.warehouse_id, self.sh_warehouse)
-
- # 指定商品的时候,选择的行必须是该商品的
- self.inventory.goods = [4, self.goods_mouse.id] # '鼠标'
- self.inventory.query_inventory()
- for line in self.inventory.line_ids:
- self.assertEqual(line.goods_id.name, '鼠标')
-
- self.inventory.unlink()
- self.assertTrue(not self.inventory.exists())
-
- def test_query_inventory_transfer_order(self):
- '''盘点单查询的盘点数量不应该包含移库在途的,在途移库数量恰好等于仓库中数量'''
- internal_order = self.env.ref('warehouse.wh_internal_whint0')
- for line in internal_order.line_out_ids:
- line.goods_qty = 48
- inventory = self.env['wh.inventory'].create({
- 'warehouse_id': self.browse_ref('warehouse.hd_stock').id,
- })
- inventory.query_inventory()
-
- def test_generate_inventory(self):
- for line in self.inventory.line_ids:
- if line.goods_id.name == '键鼠套装':
- mouse = line
- else:
- cable = line
-
- # 不输入任何值的时候的onchange_qty会讲lot_type设置为nothing
- mouse.onchange_qty()
- self.assertEqual(mouse.lot_type, 'nothing')
-
- # 实际数量小与系统库存一个的时候,差异数量为-1
- mouse.inventory_qty = mouse.real_qty - 1
- mouse.onchange_qty()
- self.assertEqual(mouse.difference_qty, -1)
-
- # 实际数量大与系统库存一个的时候,差异数量为1
- mouse.inventory_qty = mouse.real_qty + 1
- mouse.onchange_qty()
- self.assertEqual(mouse.difference_qty, 1)
-
- # 实际辅助数量改变的时候,实际数量应该跟着改变
- mouse.inventory_uos_qty = mouse.real_uos_qty + 1
- mouse.onchange_uos_qty()
- self.assertEqual(mouse.goods_id.conversion_unit(
- mouse.inventory_uos_qty), mouse.inventory_qty)
-
- mouse.line_role_back()
- mouse.inventory_qty = mouse.real_qty + 1
- mouse.onchange_qty()
- cable.inventory_qty = cable.real_qty - 1
- cable.onchange_qty()
-
- # 此时鼠标数量+1,网线数量-1,生成一个鼠标的入库单,和网线的出库单
- self.inventory.generate_inventory()
- self.assertTrue(self.inventory.out_id)
- self.assertTrue(self.inventory.in_id)
-
- # 验证商品
- self.assertEqual(
- self.inventory.out_id.line_out_ids.goods_id, cable.goods_id)
- self.assertEqual(
- self.inventory.in_id.line_in_ids.goods_id, mouse.goods_id)
-
- # 验证数量
- self.assertEqual(self.inventory.out_id.line_out_ids.goods_qty, 1)
- self.assertEqual(self.inventory.in_id.line_in_ids.goods_qty, 1)
-
- # 重新盘点的时候相关的出入库单的单据必须未审核
- self.inventory.in_id.approve_order()
- with self.assertRaises(UserError):
- self.inventory.requery_inventory()
-
- self.inventory.in_id.cancel_approved_order()
- self.inventory.requery_inventory()
-
- self.inventory.generate_inventory()
- self.inventory.out_id.approve_order()
- self.inventory.in_id.approve_order()
-
- # 相关的出入库单据完成后,盘点单应该自动完成
- self.assertEqual(self.inventory.state, 'done')
-
- # 完成的单据不应该被删除
- with self.assertRaises(UserError):
- self.inventory.unlink()
-
- results = self.inventory.open_in()
- real_results = {
- 'type': 'ir.actions.act_window',
- 'res_model': 'wh.in',
- 'view_mode': 'form',
- 'res_id': self.inventory.in_id.id,
- }
-
- self.assertEqual(results, real_results)
-
- results = self.inventory.open_out()
- real_results = {
- 'type': 'ir.actions.act_window',
- 'res_model': 'wh.out',
- 'view_mode': 'form',
- 'res_id': self.inventory.out_id.id,
- }
-
- self.assertEqual(results, real_results)
-
- def test_check_done_state_done(self):
- ''' Test: check_done state == 'done' '''
- for line in self.inventory.line_ids:
- if line.goods_id.name == '键鼠套装':
- mouse = line
-
- # 实际数量小与系统库存一个的时候,差异数量为-1
- mouse.inventory_qty = mouse.real_qty - 1
- mouse.onchange_qty()
- # 此时鼠标数量-1,生成一个鼠标的出库单
- self.inventory.generate_inventory()
-
- self.inventory.out_id.approve_order()
- self.inventory.out_id.cancel_approved_order()
-
- def test_get_difference_uos_qty(self):
- ''' Test: _get_difference_uos_qty '''
- for line in self.inventory.line_ids:
- if line.goods_id.name == '键鼠套装':
- mouse = line
-
- # 实际辅助数量少1个
- mouse.inventory_uos_qty = mouse.inventory_qty - 1
- mouse.onchange_uos_qty()
- self.assertEqual(mouse.difference_uos_qty, -1)
-
- def test_check_difference_identical(self):
- ''' Test: check_difference_identical '''
- for line in self.inventory.line_ids:
- if line.goods_id.name == '键鼠套装':
- mouse = line
-
- # 实际辅助数量少1个
- mouse.inventory_uos_qty = mouse.inventory_qty - 1
- mouse.onchange_uos_qty()
- self.assertEqual(mouse.difference_uos_qty, -1)
- # 盘盈盘亏数量应该与辅助单位的盘盈盘亏数量盈亏方向不一致
- mouse.difference_qty = 1
- mouse.check_difference_identical()
-
- def test_check_done(self):
- '''盘盈盘亏产生的入库单和出库单审核时检查'''
- self.inventory.query_inventory()
- self.inventory.generate_inventory()
-
- def test_inventory_get_default_warehouse(self):
- ''' 测试 获取盘点仓库 '''
- self.env['wh.inventory'].create({
- 'date': '2016-12-30',
- })
-
- def test_generate_inventory_twice(self):
- '''重复点击生成盘点单据按钮'''
- self.inventory.query_inventory()
- self.inventory.generate_inventory()
- with self.assertRaises(UserError):
- self.inventory.generate_inventory()
-
- def test_inventory_line_get_difference_qty(self):
- '''_get_difference_qty:difference_qty=0,difference_uos_qty!=0'''
- for line in self.inventory.line_ids:
- if line.goods_id.name == '网线':
- cable = line
-
- # 实际辅助数量少1个 实际数量为1
- cable.inventory_uos_qty = cable.inventory_uos_qty - 1
|