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

304 lines
13KB

  1. from odoo.tests.common import TransactionCase
  2. from odoo.exceptions import UserError, ValidationError
  3. class TestMoveLine(TransactionCase):
  4. ''' 测试库存调拨 '''
  5. def setUp(self):
  6. super(TestMoveLine, self).setUp()
  7. self.keyboard_mouse_in_line = self.browse_ref(
  8. 'warehouse.wh_move_line_keyboard_mouse_in_2')
  9. self.keyboard_mouse_out_line = self.browse_ref(
  10. 'warehouse.wh_move_line_keyboard_mouse_in_2')
  11. self.mouse_in_line = self.browse_ref('warehouse.wh_move_line_12')
  12. self.mouse_in_line.cost = self.mouse_in_line.cost_unit * self.mouse_in_line.goods_qty
  13. self.mouse_out_line = self.browse_ref('warehouse.wh_move_line_0')
  14. self.cable_int_line = self.browse_ref('warehouse.wh_move_line_17')
  15. self.bj_warehouse = self.browse_ref('warehouse.bj_stock')
  16. self.hd_warehouse = self.browse_ref('warehouse.hd_stock')
  17. self.goods_mouse = self.browse_ref('goods.mouse')
  18. self.goods_cable = self.browse_ref('goods.cable')
  19. self.assembly = self.browse_ref('warehouse.wh_assembly_ass0')
  20. def test_origin_explain(self):
  21. explain = self.mouse_in_line.get_origin_explain()
  22. self.assertEqual(explain, '盘盈')
  23. explain = self.mouse_out_line.get_origin_explain()
  24. self.assertEqual(explain, '组装单子件')
  25. explain = self.cable_int_line.get_origin_explain()
  26. self.assertEqual(explain, '调拨入库')
  27. self.cable_int_line.move_id.origin = ''
  28. explain = self.cable_int_line.get_origin_explain()
  29. self.assertEqual(explain, '')
  30. def test_default(self):
  31. # 需找默认的仓库
  32. defaults = self.env['wh.move.line'].with_context({
  33. 'goods_id': 1,
  34. 'warehouse_id': 1,
  35. }).default_get(['goods_id', 'warehouse_id'])
  36. self.assertEqual(defaults.get('goods_id'), 1)
  37. self.assertEqual(defaults.get('warehouse_id'), 1)
  38. def test_name_get(self):
  39. line = self.mouse_in_line
  40. name = line.with_context({'match': 1}).name_get()
  41. real_name = '%s-%s->%s(%s, %s%s)' % (line.move_id.name, line.warehouse_id.name,
  42. line.warehouse_dest_id.name, line.goods_id.name,
  43. str(line.goods_qty), line.uom_id.name)
  44. self.assertEqual(name[0][1], real_name)
  45. lot_name = line.name_get()
  46. real_lot_name = line.lot
  47. self.assertEqual(lot_name[0][1], real_lot_name)
  48. def test_copy_data(self):
  49. # 复制的时候,如果该明细行是出库行为,那么需要重新计算成本
  50. _, cost_unit = self.mouse_out_line.goods_id.get_suggested_cost_by_warehouse(
  51. self.mouse_out_line.warehouse_id, self.mouse_out_line.goods_qty,
  52. lot_id=self.mouse_out_line.lot_id)
  53. self.assertEqual(cost_unit, self.mouse_out_line.lot_id.cost_unit)
  54. def test_get_matching_records_by_lot(self):
  55. # 批次号未审核的时候获取批次信息会报错
  56. with self.assertRaises(UserError):
  57. self.mouse_out_line.goods_id.get_matching_records_by_lot(
  58. self.mouse_out_line.lot_id, self.mouse_out_line.goods_qty)
  59. # 批次号不存在的时候应该报错
  60. with self.assertRaises(UserError):
  61. self.mouse_out_line.goods_id.get_matching_records_by_lot(False, 0)
  62. self.mouse_out_line.lot_id.action_done()
  63. results, _ = self.mouse_out_line.goods_id.get_matching_records_by_lot(
  64. self.mouse_out_line.lot_id, self.mouse_out_line.goods_qty,
  65. self.mouse_out_line.goods_uos_qty)
  66. real_results = {
  67. 'line_in_id': self.mouse_out_line.lot_id.id,
  68. 'qty': self.mouse_out_line.goods_qty,
  69. 'uos_qty': self.mouse_out_line.goods_uos_qty,
  70. 'expiration_date': False,
  71. }
  72. self.assertEqual(results[0], real_results)
  73. # 当前明细行的商品数量大于批次的数量的时候,会报错
  74. with self.assertRaises(UserError):
  75. self.mouse_out_line.goods_id.get_matching_records_by_lot(
  76. self.mouse_out_line.lot_id,
  77. self.mouse_out_line.lot_id.qty_remaining + 10)
  78. def test_attribute(self):
  79. '''在出库类型的明细行中,选择商品属性,lot_id的domain需要包含属性相关'''
  80. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  81. 'finance.account_goods').id
  82. self.env.ref('warehouse.wh_in_wh_in_attribute').date = '2016-02-06'
  83. attribute_in = self.browse_ref('warehouse.wh_in_wh_in_attribute')
  84. white_iphone = self.browse_ref('warehouse.wh_move_line_iphone_in_1')
  85. white_iphone.cost = white_iphone.cost_unit * white_iphone.goods_qty
  86. black_iphone = self.browse_ref('warehouse.wh_move_line_iphone_in_2')
  87. black_iphone.cost = black_iphone.cost_unit * black_iphone.goods_qty
  88. out_iphone = self.browse_ref('warehouse.wh_move_line_iphone_out')
  89. attribute_in.approve_order()
  90. # 指定属性的时候,出库成本会寻找和自己属性一致的入库行
  91. out_iphone.attribute_id = white_iphone.attribute_id
  92. out_iphone.action_done()
  93. self.assertEqual(out_iphone.cost_unit, white_iphone.cost_unit)
  94. out_iphone.action_draft()
  95. out_iphone.attribute_id = black_iphone.attribute_id
  96. real_domain = [
  97. ('goods_id', '=', out_iphone.goods_id.id),
  98. ('state', '=', 'done'),
  99. ('lot', '!=', False),
  100. ('qty_remaining', '>', 0),
  101. ('warehouse_dest_id.type', '=', 'stock'),
  102. ('warehouse_dest_id', '=', out_iphone.warehouse_id.id),
  103. ('attribute_id', '=', black_iphone.attribute_id.id)
  104. ]
  105. domain = out_iphone.with_context({
  106. 'default_warehouse_id': out_iphone.move_id.warehouse_id.id
  107. }).onchange_attribute_id().get('domain')
  108. self.assertEqual(real_domain, domain.get('lot_id'))
  109. out_iphone.action_done()
  110. self.assertEqual(out_iphone.cost_unit, black_iphone.cost_unit)
  111. def test_onchange(self):
  112. '''在出库类型的明细行中,选择商品,lot_id的domain需要包含仓库相关'''
  113. results = self.mouse_out_line.with_context({
  114. 'default_warehouse_id': self.mouse_out_line.move_id.warehouse_id.id
  115. }).onchange_goods_id()
  116. real_domain = [
  117. ('goods_id', '=', self.mouse_out_line.goods_id.id),
  118. ('state', '=', 'done'),
  119. ('lot', '!=', False),
  120. ('qty_remaining', '>', 0),
  121. ('warehouse_dest_id.type', '=', 'stock'),
  122. ('warehouse_dest_id', '=', self.mouse_out_line.warehouse_id.id)
  123. ]
  124. # 商品改变的时候,此时仓库存在,lot_id字段的domain值需要包含仓库相关
  125. self.assertEqual(results['domain']['lot_id'], real_domain)
  126. self.assertEqual(self.mouse_out_line.goods_qty, 1)
  127. results = self.keyboard_mouse_out_line.with_context({
  128. 'type': 'out',
  129. }).onchange_goods_id()
  130. self.assertEqual(self.keyboard_mouse_out_line.goods_qty,
  131. self.keyboard_mouse_out_line.goods_id.conversion_unit(
  132. self.keyboard_mouse_out_line.goods_uos_qty))
  133. # 改变仓库的时候,如果批号的仓库和它不一致,那么批号需要被删除
  134. self.assertTrue(self.mouse_out_line.lot_id)
  135. self.mouse_out_line.warehouse_id = self.bj_warehouse
  136. self.mouse_out_line.onchange_warehouse_id()
  137. self.assertTrue(not self.mouse_out_line.lot_id)
  138. # 改变商品的时候,如果批号的商品和它不一致,那么批号也要被删除
  139. self.mouse_out_line.lot_id = self.mouse_in_line
  140. self.mouse_out_line.warehouse_id = self.hd_warehouse
  141. self.mouse_out_line.goods_id = self.goods_cable
  142. self.mouse_out_line.compute_lot_compatible()
  143. self.assertTrue(not self.mouse_out_line.lot_id)
  144. self.mouse_out_line.goods_id = self.goods_mouse
  145. self.keyboard_mouse_in_line.cost_unit = 0
  146. results = self.keyboard_mouse_out_line.with_context({
  147. 'type': 'out',
  148. }).onchange_goods_qty()
  149. # 出库的单据,数量改变的时候,成本应该跟着改变
  150. _, cost_unit = self.keyboard_mouse_out_line.goods_id.get_suggested_cost_by_warehouse(
  151. self.keyboard_mouse_out_line.warehouse_id, self.keyboard_mouse_out_line.goods_qty)
  152. self.assertEqual(self.keyboard_mouse_out_line.cost_unit, cost_unit)
  153. self.keyboard_mouse_out_line.goods_id = self.goods_cable
  154. self.keyboard_mouse_out_line.goods_uos_qty = 10
  155. temp_goods_qty = self.keyboard_mouse_out_line.goods_id.conversion_unit(
  156. 10)
  157. self.keyboard_mouse_out_line.onchange_goods_uos_qty()
  158. self.assertEqual(self.keyboard_mouse_out_line.goods_qty, temp_goods_qty)
  159. self.mouse_in_line.action_done()
  160. self.mouse_out_line.lot_qty = 0
  161. self.mouse_out_line.lot_id = self.mouse_in_line
  162. self.mouse_out_line.with_context(
  163. {'type': 'internal'}).onchange_lot_id()
  164. # 当传递type为internal的上下文值的时候,此时lot会设置为lot_id的lot
  165. self.assertEqual(self.mouse_out_line.lot,
  166. self.mouse_out_line.lot_id.lot)
  167. self.assertEqual(self.mouse_out_line.lot_qty,
  168. self.mouse_out_line.lot_id.qty_remaining)
  169. self.mouse_in_line.discount_rate = 0
  170. self.mouse_in_line.onchange_discount_rate()
  171. self.assertEqual(self.mouse_in_line.discount_amount, 0)
  172. self.mouse_in_line.price = 100
  173. self.mouse_in_line.discount_rate = 100
  174. self.mouse_in_line.onchange_discount_rate()
  175. self.assertEqual(self.mouse_in_line.discount_amount,
  176. self.mouse_in_line.goods_qty * self.mouse_in_line.price)
  177. with self.assertRaises(UserError):
  178. self.mouse_in_line.unlink()
  179. self.mouse_in_line.warehouse_id = self.mouse_in_line.warehouse_dest_id
  180. with self.assertRaises(UserError):
  181. self.mouse_in_line.check_availability()
  182. def test_onchange_goods_id_no_goods(self):
  183. ''' 测试 onchange_goods_id no goods '''
  184. self.goods_id = False
  185. self.env['wh.move.line'].onchange_goods_id()
  186. def test_onchange_goods_id_in_cost_unit(self):
  187. ''' 测试 onchange_goods_id 入库单行默认带出入库成本 '''
  188. self.mouse_in_line.goods_id = self.goods_cable
  189. self.mouse_in_line.with_context({'type': 'in'}).onchange_goods_id()
  190. def test_name_search(self):
  191. '''测试批号下拉的时候显示批次和剩余数量'''
  192. move_line = self.env.ref('warehouse.wh_move_line_12')
  193. result = self.env['wh.move.line'].name_search('ms160301')
  194. real_result = [(move_line.id, move_line.lot + ' ' +
  195. move_line.warehouse_dest_id.name + ' 余 ' + str(move_line.goods_qty))]
  196. self.assertEqual(result, real_result)
  197. def test_name_search_args(self):
  198. '''批号下拉时候以domain搜索'''
  199. result = self.env['wh.move.line'].name_search(args=[('lot', '=', 'ms160301')])
  200. real_result = [(self.mouse_in_line.id, self.mouse_in_line.lot + ' ' +
  201. self.mouse_in_line.warehouse_dest_id.name + ' 余 ' + str(self.mouse_in_line.goods_qty))]
  202. self.assertEqual(result, real_result)
  203. def test_compute_all_amount_wrong_tax_rate(self):
  204. '''明细行上输入错误税率,应报错'''
  205. with self.assertRaises(UserError):
  206. self.mouse_in_line.tax_rate = -1
  207. self.mouse_in_line.read()
  208. with self.assertRaises(UserError):
  209. self.mouse_in_line.tax_rate = 102
  210. self.mouse_in_line.read()
  211. def test_compute_cost(self):
  212. '''计算成本if语句'''
  213. self.mouse_in_line.with_context({'type': 'in'}).price = 100
  214. #self.assertEqual(self.mouse_in_line.cost, 100)
  215. def test_onchange_discount_amount(self):
  216. '''当优惠金额发生变化时'''
  217. self.assertEqual(self.mouse_in_line.cost, 40)
  218. self.assertEqual(self.mouse_in_line.cost_unit, 40)
  219. self.mouse_in_line.with_context({'type': 'in'}).discount_amount = 5
  220. self.mouse_in_line.onchange_discount_amount()
  221. #self.assertEqual(self.mouse_in_line.cost, 35)
  222. #self.assertEqual(self.mouse_in_line.read()[0]['cost_unit'], 40) # """单位成本并没发生变化"""
  223. def test_check_goods_qty(self):
  224. '''序列号管理的商品数量必须为1'''
  225. # 鼠标进行了序列号管理
  226. with self.assertRaises(UserError):
  227. self.mouse_in_line.goods_qty = 2
  228. def test_action_done_no_lot_raise_error(self):
  229. '''检查属性或批号是否填充'''
  230. # type=in,lot为空
  231. self.mouse_in_line.lot = False
  232. with self.assertRaises(UserError):
  233. self.mouse_in_line.action_done()
  234. # type=out,lot_id为空
  235. self.mouse_out_line.lot_id = False
  236. with self.assertRaises(UserError):
  237. self.mouse_out_line.action_done()
  238. # 属性为空
  239. keyboard_line = self.env.ref('warehouse.wh_move_line_13')
  240. keyboard_line.attribute_id = False
  241. with self.assertRaises(UserError):
  242. keyboard_line.action_done()
上海开阖软件有限公司 沪ICP备12045867号-1