GoodERP
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

265 lines
10KB

  1. from odoo.tests.common import TransactionCase
  2. from odoo.exceptions import UserError
  3. import time
  4. import logging
  5. _logger = logging.getLogger(__name__)
  6. class TestInventory(TransactionCase):
  7. def setUp(self):
  8. super(TestInventory, self).setUp()
  9. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  10. 'finance.account_goods').id
  11. self.env.ref('warehouse.wh_in_whin1').date = '2016-02-06'
  12. self.env.ref('warehouse.wh_in_whin3').date = '2016-02-06'
  13. self.others_in = self.browse_ref('warehouse.wh_in_whin1')
  14. self.others_in_2 = self.browse_ref('warehouse.wh_in_whin3')
  15. self.goods_mouse = self.browse_ref('goods.mouse')
  16. self.sh_warehouse = self.browse_ref('warehouse.sh_stock')
  17. # 创建一个临时的一个库存调拨,将1个商品调拨到上海仓库
  18. self.temp_mouse_in = self.env['wh.move.line'].with_context({
  19. 'type': 'in',
  20. }).create({
  21. 'move_id': self.others_in.move_id.id,
  22. 'goods_id': self.goods_mouse.id,
  23. 'uom_id': self.goods_mouse.uom_id.id,
  24. 'uos_id': self.goods_mouse.uos_id.id,
  25. 'warehouse_dest_id': self.sh_warehouse.id,
  26. 'goods_qty': 1,
  27. 'goods_uos_qty': self.goods_mouse.anti_conversion_unit(1),
  28. 'cost_unit': 30,
  29. 'lot': 'MOUSE0001',
  30. })
  31. # 商品 实际数量 实际辅助数量
  32. # 键鼠套装 96 2
  33. # 鼠标 1 1
  34. # 网线 48 1
  35. self.temp_mouse_in.location_id = self.env.ref('warehouse.b001_location').id
  36. self.others_in.approve_order()
  37. self.others_in_2.approve_order()
  38. self.temp_mouse_in.action_done()
  39. # 创建一个临时的库存调拨,此时数量为0,但是辅助数量为1
  40. self.temp_mouse_in_zero_qty = self.env['wh.move.line'].with_context({
  41. 'type': 'in',
  42. }).create({
  43. 'move_id': self.others_in.move_id.id,
  44. 'goods_id': self.goods_mouse.id,
  45. 'uom_id': self.goods_mouse.uom_id.id,
  46. 'uos_id': self.goods_mouse.uos_id.id,
  47. 'warehouse_dest_id': self.sh_warehouse.id,
  48. 'location_id':self.temp_mouse_in.location_id.id,
  49. 'goods_qty': 0,
  50. 'goods_uos_qty': 0,
  51. 'cost_unit': 30,
  52. 'lot': 'MOUSE0002',
  53. })
  54. self.temp_mouse_in_zero_qty.action_done()
  55. ''' odoo13 必须在这里read一下后面sql才能取到数据 '''
  56. for _l in self.env['wh.move.line'].search([('state', '=', 'done')]):
  57. _logger.info('%s %s +%s' % (
  58. _l.goods_id.name, _l.warehouse_dest_id.name, _l.goods_qty))
  59. self.inventory = self.env['wh.inventory'].create({
  60. 'warehouse_id': self.browse_ref('warehouse.hd_stock').id,
  61. })
  62. self.inventory.query_inventory()
  63. def test_query_inventory(self):
  64. # 盘点单查询的结果必须和每个商品单据查询的结果一致
  65. for line in self.inventory.line_ids:
  66. goods_stock = line.goods_id.get_stock_qty()[0]
  67. self.assertEqual(goods_stock.get('warehouse'),
  68. line.warehouse_id.name)
  69. if line.goods_id.name == '网线': # 网线在途移库 120个,盘点时应减去
  70. self.assertEqual(goods_stock.get('qty') - 120, line.real_qty)
  71. else:
  72. self.assertEqual(goods_stock.get('qty'), line.real_qty)
  73. # 当指定仓库的时候,选择的行必须是该仓库的
  74. self.inventory.warehouse_id = self.sh_warehouse
  75. self.inventory.query_inventory()
  76. for line in self.inventory.line_ids:
  77. self.assertEqual(line.warehouse_id, self.sh_warehouse)
  78. # 指定商品的时候,选择的行必须是该商品的
  79. self.inventory.goods = [4, self.goods_mouse.id] # '鼠标'
  80. self.inventory.query_inventory()
  81. for line in self.inventory.line_ids:
  82. self.assertEqual(line.goods_id.name, '鼠标')
  83. self.inventory.unlink()
  84. self.assertTrue(not self.inventory.exists())
  85. def test_query_inventory_transfer_order(self):
  86. '''盘点单查询的盘点数量不应该包含移库在途的,在途移库数量恰好等于仓库中数量'''
  87. internal_order = self.env.ref('warehouse.wh_internal_whint0')
  88. for line in internal_order.line_out_ids:
  89. line.goods_qty = 48
  90. inventory = self.env['wh.inventory'].create({
  91. 'warehouse_id': self.browse_ref('warehouse.hd_stock').id,
  92. })
  93. inventory.query_inventory()
  94. def test_generate_inventory(self):
  95. for line in self.inventory.line_ids:
  96. if line.goods_id.name == '键鼠套装':
  97. mouse = line
  98. else:
  99. cable = line
  100. # 不输入任何值的时候的onchange_qty会讲lot_type设置为nothing
  101. mouse.onchange_qty()
  102. self.assertEqual(mouse.lot_type, 'nothing')
  103. # 实际数量小与系统库存一个的时候,差异数量为-1
  104. mouse.inventory_qty = mouse.real_qty - 1
  105. mouse.onchange_qty()
  106. self.assertEqual(mouse.difference_qty, -1)
  107. # 实际数量大与系统库存一个的时候,差异数量为1
  108. mouse.inventory_qty = mouse.real_qty + 1
  109. mouse.onchange_qty()
  110. self.assertEqual(mouse.difference_qty, 1)
  111. # 实际辅助数量改变的时候,实际数量应该跟着改变
  112. mouse.inventory_uos_qty = mouse.real_uos_qty + 1
  113. mouse.onchange_uos_qty()
  114. self.assertEqual(mouse.goods_id.conversion_unit(
  115. mouse.inventory_uos_qty), mouse.inventory_qty)
  116. mouse.line_role_back()
  117. mouse.inventory_qty = mouse.real_qty + 1
  118. mouse.onchange_qty()
  119. cable.inventory_qty = cable.real_qty - 1
  120. cable.onchange_qty()
  121. # 此时鼠标数量+1,网线数量-1,生成一个鼠标的入库单,和网线的出库单
  122. self.inventory.generate_inventory()
  123. self.assertTrue(self.inventory.out_id)
  124. self.assertTrue(self.inventory.in_id)
  125. # 验证商品
  126. self.assertEqual(
  127. self.inventory.out_id.line_out_ids.goods_id, cable.goods_id)
  128. self.assertEqual(
  129. self.inventory.in_id.line_in_ids.goods_id, mouse.goods_id)
  130. # 验证数量
  131. self.assertEqual(self.inventory.out_id.line_out_ids.goods_qty, 1)
  132. self.assertEqual(self.inventory.in_id.line_in_ids.goods_qty, 1)
  133. # 重新盘点的时候相关的出入库单的单据必须未审核
  134. self.inventory.in_id.approve_order()
  135. with self.assertRaises(UserError):
  136. self.inventory.requery_inventory()
  137. self.inventory.in_id.cancel_approved_order()
  138. self.inventory.requery_inventory()
  139. self.inventory.generate_inventory()
  140. self.inventory.out_id.approve_order()
  141. self.inventory.in_id.approve_order()
  142. # 相关的出入库单据完成后,盘点单应该自动完成
  143. self.assertEqual(self.inventory.state, 'done')
  144. # 完成的单据不应该被删除
  145. with self.assertRaises(UserError):
  146. self.inventory.unlink()
  147. results = self.inventory.open_in()
  148. real_results = {
  149. 'type': 'ir.actions.act_window',
  150. 'res_model': 'wh.in',
  151. 'view_mode': 'form',
  152. 'res_id': self.inventory.in_id.id,
  153. }
  154. self.assertEqual(results, real_results)
  155. results = self.inventory.open_out()
  156. real_results = {
  157. 'type': 'ir.actions.act_window',
  158. 'res_model': 'wh.out',
  159. 'view_mode': 'form',
  160. 'res_id': self.inventory.out_id.id,
  161. }
  162. self.assertEqual(results, real_results)
  163. def test_check_done_state_done(self):
  164. ''' Test: check_done state == 'done' '''
  165. for line in self.inventory.line_ids:
  166. if line.goods_id.name == '键鼠套装':
  167. mouse = line
  168. # 实际数量小与系统库存一个的时候,差异数量为-1
  169. mouse.inventory_qty = mouse.real_qty - 1
  170. mouse.onchange_qty()
  171. # 此时鼠标数量-1,生成一个鼠标的出库单
  172. self.inventory.generate_inventory()
  173. self.inventory.out_id.approve_order()
  174. self.inventory.out_id.cancel_approved_order()
  175. def test_get_difference_uos_qty(self):
  176. ''' Test: _get_difference_uos_qty '''
  177. for line in self.inventory.line_ids:
  178. if line.goods_id.name == '键鼠套装':
  179. mouse = line
  180. # 实际辅助数量少1个
  181. mouse.inventory_uos_qty = mouse.inventory_qty - 1
  182. mouse.onchange_uos_qty()
  183. self.assertEqual(mouse.difference_uos_qty, -1)
  184. def test_check_difference_identical(self):
  185. ''' Test: check_difference_identical '''
  186. for line in self.inventory.line_ids:
  187. if line.goods_id.name == '键鼠套装':
  188. mouse = line
  189. # 实际辅助数量少1个
  190. mouse.inventory_uos_qty = mouse.inventory_qty - 1
  191. mouse.onchange_uos_qty()
  192. self.assertEqual(mouse.difference_uos_qty, -1)
  193. # 盘盈盘亏数量应该与辅助单位的盘盈盘亏数量盈亏方向不一致
  194. mouse.difference_qty = 1
  195. mouse.check_difference_identical()
  196. def test_check_done(self):
  197. '''盘盈盘亏产生的入库单和出库单审核时检查'''
  198. self.inventory.query_inventory()
  199. self.inventory.generate_inventory()
  200. def test_inventory_get_default_warehouse(self):
  201. ''' 测试 获取盘点仓库 '''
  202. self.env['wh.inventory'].create({
  203. 'date': '2016-12-30',
  204. })
  205. def test_generate_inventory_twice(self):
  206. '''重复点击生成盘点单据按钮'''
  207. self.inventory.query_inventory()
  208. self.inventory.generate_inventory()
  209. with self.assertRaises(UserError):
  210. self.inventory.generate_inventory()
  211. def test_inventory_line_get_difference_qty(self):
  212. '''_get_difference_qty:difference_qty=0,difference_uos_qty!=0'''
  213. for line in self.inventory.line_ids:
  214. if line.goods_id.name == '网线':
  215. cable = line
  216. # 实际辅助数量少1个 实际数量为1
  217. cable.inventory_uos_qty = cable.inventory_uos_qty - 1
上海开阖软件有限公司 沪ICP备12045867号-1