GoodERP
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

699 lignes
28KB

  1. from odoo.tests.common import TransactionCase
  2. from odoo.exceptions import UserError, ValidationError
  3. class TestProduction(TransactionCase):
  4. ''' 测试组装单和拆卸单 '''
  5. def setUp(self):
  6. super(TestProduction, self).setUp()
  7. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  8. 'finance.account_goods').id
  9. self.env.ref('warehouse.wh_in_whin0').date = '2016-02-06'
  10. self.assembly = self.browse_ref('warehouse.wh_assembly_ass0')
  11. self.assembly_mutli = self.browse_ref('warehouse.wh_assembly_ass1')
  12. self.assembly_mutli_keyboard_mouse_1 = self.browse_ref(
  13. 'warehouse.wh_move_line_ass2')
  14. self.assembly_mutli_keyboard_mouse_2 = self.browse_ref(
  15. 'warehouse.wh_move_line_ass3')
  16. self.disassembly = self.browse_ref('warehouse.wh_disassembly_dis1')
  17. self.disassembly_bom = self.browse_ref('warehouse.wh_bom_0')
  18. self.disassembly_mouse = self.browse_ref('warehouse.wh_move_line_8')
  19. self.disassembly_keyboard = self.browse_ref('warehouse.wh_move_line_9')
  20. self.overage_in = self.browse_ref('warehouse.wh_in_whin0')
  21. in_mouse_1 = self.env.ref('warehouse.wh_move_line_12')
  22. in_mouse_1.cost = in_mouse_1.cost_unit * in_mouse_1.goods_qty
  23. in_mouse_2 = self.env.ref('warehouse.wh_move_line_mouse_2')
  24. in_mouse_2.cost = in_mouse_2.cost_unit * in_mouse_2.goods_qty
  25. in_keyboard = self.env.ref('warehouse.wh_move_line_13')
  26. in_keyboard.cost = in_keyboard.cost_unit * in_keyboard.goods_qty
  27. in_cable = self.env.ref('warehouse.wh_move_line_14')
  28. in_cable.cost = in_cable.cost_unit * in_cable.goods_qty
  29. self.overage_in.approve_order()
  30. for l in self.env['wh.move.line'].search([]):
  31. l.read()
  32. self.outsource_out1 = self.browse_ref('warehouse.outsource_out1')
  33. def test_approve(self):
  34. # 库存不足的时候直接拆卸,会报没有库存的异常
  35. with self.assertRaises(UserError):
  36. self.disassembly.approve_feeding()
  37. # 先组装,后拆卸可以正常出入库
  38. self.assembly.approve_feeding()
  39. self.assembly.approve_order()
  40. self.disassembly.approve_feeding()
  41. self.disassembly.approve_order()
  42. self.assertEqual(self.assembly.state, 'done')
  43. self.assertEqual(self.disassembly.state, 'done')
  44. def test_approve_outsource_goods_lots(self):
  45. # 有批号委外加工单入库
  46. self.outsource_out1.approve_feeding()
  47. self.outsource_out1.lot = '123'
  48. self.outsource_out1.approve_order()
  49. def test_approve_assembly_disassembly_goods_lots(self):
  50. # 有批号组装单入库
  51. self.assembly.approve_feeding()
  52. self.assembly.lot = '123'
  53. self.assembly.approve_order()
  54. # 有批号拆卸单组合产品出库
  55. lot_id = self.env['wh.move.line'].search([('state', '=', 'done'),
  56. ('goods_id', '=', self.env.ref('goods.keyboard_mouse').id)])
  57. self.disassembly.lot_id = lot_id.id
  58. self.disassembly.approve_feeding()
  59. self.disassembly.approve_order()
  60. def test_assembly_apporve_exist_scape(self):
  61. # 组装单成品入库存在报废
  62. self.assembly_mutli.approve_feeding()
  63. self.assembly_mutli_keyboard_mouse_1.goods_qty = 10
  64. self.assembly_mutli_keyboard_mouse_2.scrap = True
  65. # 请在公司上输入 废品库
  66. with self.assertRaises(UserError):
  67. self.assembly_mutli.approve_order()
  68. self.env.user.company_id.wh_scrap_id = self.env.ref('warehouse.bj_stock').id
  69. self.assembly_mutli.approve_order()
  70. # 成品入库到废品仓的反审核
  71. #self.assembly_mutli.cancel_approved_order()
  72. def test_disassembly_apporve_exist_scape(self):
  73. # 拆卸单子产品入库存在报废
  74. # 先组装,后拆卸可以正常出入库
  75. self.assembly.approve_feeding()
  76. self.assembly.approve_order()
  77. self.disassembly.approve_feeding()
  78. self.disassembly_mouse.scrap = True
  79. self.disassembly_keyboard.scrap = True # 为了覆盖move_line 的action_done 中最后一个else
  80. self.env.user.company_id.wh_scrap_id = self.env.ref('warehouse.bj_stock').id
  81. self.disassembly.approve_order()
  82. # 成品入库到废品仓的反审核
  83. self.disassembly.cancel_approved_order()
  84. def test_outsource_apporve_exist_scape(self):
  85. # 拆卸单子产品入库存在报废
  86. self.outsource_out1.approve_feeding()
  87. keyboard_mouse = self.env.ref('warehouse.wh_move_line_out3')
  88. keyboard_mouse.scrap = True
  89. self.env.user.company_id.wh_scrap_id = self.env.ref('warehouse.bj_stock').id
  90. self.outsource_out1.approve_order()
  91. # 成品入库到废品仓的反审核
  92. #self.outsource_out1.cancel_approved_order()
  93. def test_check_is_child_enable_assembly(self):
  94. # 组装 子件中不能包含与组合件中相同的 产品+属性
  95. mouse_line = self.env.ref('warehouse.wh_move_line_3')
  96. mouse_line.goods_id = self.env.ref('goods.mouse').id
  97. with self.assertRaises(UserError):
  98. self.assembly.approve_feeding()
  99. def test_check_is_child_enable_disassembly(self):
  100. # 拆卸 子件中不能包含与组合件中相同的 产品+属性
  101. mouse_line = self.env.ref('warehouse.wh_move_line_7')
  102. mouse_line.goods_id = self.env.ref('goods.mouse').id
  103. with self.assertRaises(UserError):
  104. self.disassembly.approve_feeding()
  105. def test_check_is_child_enable_outsource(self):
  106. # 委外加工单 子件中不能包含与组合件中相同的 产品+属性
  107. mouse_line = self.env.ref('warehouse.wh_move_line_out3')
  108. mouse_line.goods_id = self.env.ref('goods.mouse').id
  109. with self.assertRaises(UserError):
  110. self.outsource_out1.approve_feeding()
  111. def test_cancel(self):
  112. self.assembly.approve_feeding()
  113. self.assembly.approve_order()
  114. self.disassembly.approve_feeding()
  115. self.disassembly.approve_order()
  116. # 组装的商品已经被拆卸过了,此时会报异常
  117. with self.assertRaises(UserError):
  118. self.assembly.cancel_approved_order()
  119. self.disassembly.cancel_approved_order()
  120. # 取消后的单据的状态为 feeding
  121. self.assertEqual(self.disassembly.state, 'feeding')
  122. def test_unlink(self):
  123. self.assembly.approve_feeding()
  124. # 没法删除已经发料的单据
  125. with self.assertRaises(UserError):
  126. self.assembly.unlink()
  127. self.assembly.approve_order()
  128. # 没法删除已经审核的单据
  129. with self.assertRaises(UserError):
  130. self.assembly.unlink()
  131. self.disassembly.approve_feeding()
  132. # 没法删除已经发料的单据
  133. with self.assertRaises(UserError):
  134. self.disassembly.unlink()
  135. self.disassembly.approve_order()
  136. # 组装的商品已经被拆卸过了,此时会报异常
  137. with self.assertRaises(UserError):
  138. self.assembly.unlink()
  139. self.disassembly.cancel_approved_order()
  140. # self.assembly.cancel_approved_order()
  141. #
  142. # # 反审核后可以被删除掉
  143. # self.assembly.unlink()
  144. # self.disassembly.unlink()
  145. #
  146. # # 删除后的单据应该不存在
  147. # self.assertTrue(not self.disassembly.exists())
  148. # self.assertTrue(not self.assembly.exists())
  149. def test_unlink_outsource_raise(self):
  150. """删除发料的委外加工单"""
  151. self.outsource_out1.approve_feeding()
  152. # 没法删除已经发料的单据
  153. with self.assertRaises(UserError):
  154. self.outsource_out1.unlink()
  155. def test_create(self):
  156. temp_assembly = self.env['wh.assembly'].create({'name': '/'})
  157. temp_disassembly = self.env['wh.disassembly'].create({'name': '/'})
  158. # 编号应该由ir.sequence指定,不应该等于指定值
  159. self.assertNotEqual(temp_assembly.name, '/')
  160. self.assertNotEqual(temp_disassembly.name, '/')
  161. # 验证origin是否正确
  162. self.assertEqual(temp_assembly.origin, 'wh.assembly')
  163. self.assertEqual(temp_disassembly.origin, 'wh.disassembly')
  164. def test_apportion(self):
  165. self.assembly_mutli.fee = 0
  166. self.assembly_mutli.approve_feeding()
  167. self.assembly_mutli.approve_order()
  168. # demo数据中成本为鼠标 40 * 2,键盘 80 * 2,所以成本应该为平摊为120
  169. self.assertEqual(self.assembly_mutli_keyboard_mouse_1.cost_unit, 120)
  170. self.assertEqual(self.assembly_mutli_keyboard_mouse_2.cost_unit, 120)
  171. self.assembly_mutli.cancel_approved_order()
  172. self.assembly_mutli.fee = 100
  173. self.assembly_mutli.approve_order()
  174. # 此时组装费用为100,成本增加了100,所以平摊成本增加50
  175. self.assertEqual(self.assembly_mutli_keyboard_mouse_1.cost_unit, 170)
  176. self.assertEqual(self.assembly_mutli_keyboard_mouse_2.cost_unit, 170)
  177. def test_apportion_assembly_test_cost(self):
  178. ''' 测试 组装单 没有费用 组合件成本 '''
  179. self.assembly.fee = 0
  180. self.assembly.approve_feeding()
  181. self.assembly.approve_order()
  182. # demo数据中入库的成本为鼠标 40 * 1,键盘 80 * 2, 所以成本应该为100
  183. self.assertEqual(self.assembly.line_in_ids.cost_unit, 100)
  184. def test_apportion_assembly_cost_has_fee(self):
  185. ''' 测试 组装单 有费用 组合件成本 '''
  186. self.assembly.fee = 100
  187. self.assembly.approve_feeding()
  188. self.assembly.approve_order()
  189. # 指定组装费用位100,此时成本应该位150
  190. self.assertEqual(self.assembly.line_in_ids.cost_unit, 150)
  191. def test_apportion_disassembly_no_fee_division(self):
  192. ''' 测试 拆卸单 没有费用 子件成本 '''
  193. self.assembly.fee = 100
  194. self.assembly.approve_feeding()
  195. self.assembly.approve_order() # 指定组装费用为100,此时成本应该为150
  196. self.disassembly.approve_feeding()
  197. self.disassembly.approve_order()
  198. # 150的成本被拆分成鼠标 * 1(成本40) + 键盘 * 1(成本80),所以此时应该均分为50 + 100
  199. self.assertEqual(self.disassembly_mouse.cost_unit, 50)
  200. self.assertEqual(self.disassembly_keyboard.cost_unit, 100)
  201. def test_apportion_disassembly_has_fee_division(self):
  202. ''' 测试 拆卸单 费用分配到 子件成本 '''
  203. self.assembly.fee = 100
  204. self.assembly.approve_feeding()
  205. self.assembly.approve_order() # 指定组装费用为100,此时成本应该为150
  206. self.disassembly.fee = 120
  207. self.disassembly.approve_feeding()
  208. self.disassembly.approve_order()
  209. # 指定拆卸费用位120,此时平分270,此时应该位 90 + 180
  210. self.assertEqual(self.disassembly_mouse.cost_unit, 90)
  211. self.assertEqual(self.disassembly_keyboard.cost_unit, 180)
  212. def test_wizard_bom(self):
  213. self.assembly.bom_id = False
  214. action = self.assembly.update_bom()
  215. temp_action = {
  216. 'type': 'ir.actions.act_window',
  217. 'res_model': 'save.bom.memory',
  218. 'view_mode': 'form',
  219. 'target': 'new',
  220. }
  221. # 当bom_id不存在的时候,此时保存bom,会自动返回一个wizard
  222. self.assertEqual(action, temp_action)
  223. save_bom_memory = self.env['save.bom.memory'].with_context({
  224. 'active_model': self.assembly._name,
  225. 'active_ids': self.assembly.id
  226. }).create({'name': 'temp'})
  227. save_bom_memory.save_bom()
  228. self._test_assembly_bom(self.assembly, self.assembly.bom_id)
  229. self.disassembly.bom_id = False
  230. action = self.disassembly.update_bom()
  231. # 当bom_id不存在的时候,此时保存bom,会自动返回一个wizard
  232. self.assertEqual(action, temp_action)
  233. save_bom_memory = self.env['save.bom.memory'].with_context({
  234. 'active_model': self.disassembly._name,
  235. 'active_ids': self.disassembly.id
  236. }).create({'name': 'temp'})
  237. save_bom_memory.save_bom()
  238. self._test_disassembly_bom(self.disassembly, self.disassembly.bom_id)
  239. def test_bom(self):
  240. # 创建一个新的临时bom
  241. self.assembly.bom_id = self.env['wh.bom'].create(
  242. {'name': 'temp', 'type': 'assembly'})
  243. # 将当前的组装单保存的临时bom上去
  244. self.assembly.update_bom()
  245. # 测试bom和组装单是否一致
  246. self._test_assembly_bom(self.assembly, self.assembly.bom_id)
  247. # 删除掉明细行,防止onchange之后明细行上存在历史的数据(缓存)
  248. self.assembly.line_in_ids.unlink()
  249. # 当有一个明细行没有值的时候,此时无法通过明细行检测
  250. with self.assertRaises(UserError):
  251. self.assembly.check_parent_length()
  252. self.assembly.line_out_ids.unlink()
  253. assembly_values = {
  254. 'bom_id': self.assembly.bom_id,
  255. 'line_in_ids': False,
  256. 'line_out_ids': False,
  257. }
  258. # 使用onchange来触发bom的改变,由于相关的bug,只能使用这种方案
  259. # results = self.assembly.onchange(assembly_values, 'bom_id', {'bom_id': 'true'})
  260. # 测试使用bom后,明细行上和bom的是否一致
  261. # self._test_assembly_bom_by_results(self.assembly, self.assembly.bom_id, results['value'])
  262. self.disassembly.update_bom()
  263. self._test_disassembly_bom(self.disassembly, self.disassembly.bom_id)
  264. self.disassembly.line_in_ids.unlink()
  265. # 当有一个明细行没有值的时候,此时无法通过明细行检测
  266. with self.assertRaises(UserError):
  267. self.disassembly.check_parent_length()
  268. self.disassembly.line_out_ids.unlink()
  269. disassembly_values = {
  270. 'bom_id': self.disassembly.bom_id,
  271. 'line_in_ids': False,
  272. 'line_out_ids': False,
  273. }
  274. # results = self.disassembly.onchange(disassembly_values, 'bom_id', {'bom_id': 'true'})
  275. # self._test_disassembly_bom_by_results(self.disassembly, self.disassembly.bom_id, results['value'])
  276. def _test_assembly_bom_by_results(self, assembly, bom, results):
  277. self._test_bom(
  278. assembly, bom, parent_results=results['line_in_ids'], child_results=results['line_out_ids'])
  279. def _test_disassembly_bom_by_results(self, disassembly, bom, results):
  280. self._test_bom(
  281. disassembly, bom, parent_results=results['line_out_ids'], child_results=results['line_in_ids'])
  282. def _test_assembly_bom(self, assembly, bom):
  283. self._test_bom(assembly, bom, parent_attr='line_in_ids',
  284. child_attr='line_out_ids')
  285. def _test_disassembly_bom(self, disassembly, bom):
  286. self._test_bom(disassembly, bom,
  287. parent_attr='line_out_ids', child_attr='line_in_ids')
  288. def _test_bom(self, assembly, bom, parent_attr='line_in_ids', child_attr='line_out_ids',
  289. parent_results=None, child_results=None):
  290. bom_parent_ids = [(parent.goods_id.id, parent.goods_qty)
  291. for parent in bom.line_parent_ids]
  292. bom_child_ids = [(child.goods_id.id, child.goods_qty)
  293. for child in bom.line_child_ids]
  294. if parent_results and child_results:
  295. assembly_parent_ids = [
  296. (parent[2]['goods_id'], parent[2]['goods_qty']) for parent in parent_results]
  297. assembly_child_ids = [
  298. (child[2]['goods_id'], child[2]['goods_qty']) for child in child_results]
  299. else:
  300. assembly_parent_ids = [(parent.goods_id.id, parent.goods_qty)
  301. for parent in getattr(assembly, parent_attr)]
  302. assembly_child_ids = [(child.goods_id.id, child.goods_qty)
  303. for child in getattr(assembly, child_attr)]
  304. self.assertEqual(len(bom_parent_ids), len(assembly_parent_ids))
  305. self.assertEqual(len(bom_child_ids), len(assembly_child_ids))
  306. for parent in assembly_parent_ids:
  307. self.assertTrue(parent in bom_parent_ids)
  308. for child in assembly_child_ids:
  309. self.assertTrue(child in bom_child_ids)
  310. def test_onchange_goods_id(self):
  311. ''' 测试 onchange_goods_id '''
  312. # 组装单 onchange_goods_id
  313. wh_assembly_ass2 = self.browse_ref('warehouse.wh_assembly_ass2')
  314. wh_assembly_ass2.goods_id = self.env.ref('goods.keyboard_mouse').id
  315. wh_assembly_ass2.onchange_goods_id()
  316. # 委外加工单 onchange_goods_id
  317. self.outsource_out1.goods_id = self.env.ref('goods.keyboard_mouse')
  318. self.outsource_out1.onchange_goods_id()
  319. # 拆卸单 onchange_goods_id
  320. wh_disassembly_dis3 = self.browse_ref('warehouse.wh_disassembly_dis3')
  321. wh_disassembly_dis3.goods_id = self.env.ref('goods.keyboard_mouse').id
  322. wh_disassembly_dis3.onchange_goods_id()
  323. def test_assembly_onchange_goods_qty(self):
  324. ''' 测试 组装单 onchange_goods_qty '''
  325. # no bom_id
  326. wh_assembly_ass2 = self.browse_ref('warehouse.wh_assembly_ass2')
  327. wh_assembly_ass2.goods_qty = 2
  328. wh_assembly_ass2.onchange_goods_qty()
  329. # self.line_in_ids
  330. wh_assembly_ass0 = self.browse_ref('warehouse.wh_assembly_ass0')
  331. wh_assembly_ass0.goods_qty = 2
  332. wh_assembly_ass0.onchange_goods_qty()
  333. # has bom_id
  334. wh_assembly_ass2.name = 'combination'
  335. wh_assembly_ass2.bom_id = self.env.ref('warehouse.wh_bom_0').id
  336. wh_assembly_ass2.goods_qty = 1
  337. wh_assembly_ass2.onchange_goods_qty()
  338. def test_assembly_approve_order_no_feeding(self):
  339. ''' 测试 组装单 审核 没有投料 就审核 '''
  340. with self.assertRaises(UserError):
  341. self.assembly.approve_order()
  342. def test_assembly_unlink(self):
  343. ''' 测试 组装单 删除 '''
  344. self.assembly.unlink()
  345. def test_outsource_onchange_goods_qty_no_bom(self):
  346. ''' 测试 委外加工单 onchange_goods_qty 不存在 物料清单 '''
  347. # no bom_id
  348. self.outsource_out1.bom_id = False
  349. self.outsource_out1.goods_qty = 2
  350. self.outsource_out1.onchange_goods_qty()
  351. def test_outsource_onchange_goods_qty_has_bom(self):
  352. ''' 测试 委外加工单 onchange_goods_qty 存在 物料清单 '''
  353. # has bom_id
  354. wh_bom_0 = self.env.ref('warehouse.wh_bom_0')
  355. wh_bom_0.type = 'outsource'
  356. wh_bom_0.name = 'out source'
  357. self.outsource_out1.bom_id = self.env.ref('warehouse.wh_bom_0').id
  358. self.outsource_out1.goods_qty = 1
  359. #self.outsource_out1.onchange_goods_qty()
  360. def test_outsource_onchange_bom_no_bom(self):
  361. ''' 测试 委外加工单 onchange_bom 不存在 物料清单 '''
  362. # no bom_id
  363. self.outsource_out1.bom_id = False
  364. self.outsource_out1.onchange_bom()
  365. self.assertEqual(self.outsource_out1.goods_qty, 1.0)
  366. def test_outsource_onchange_bom_has_bom(self):
  367. ''' 测试 委外加工单 onchange_bom 存在 物料清单 '''
  368. wh_bom = self.env.ref('warehouse.wh_bom_0')
  369. # has bom_id
  370. self.outsource_out1.bom_id = wh_bom.id
  371. #self.outsource_out1.onchange_bom()
  372. def test_outsource_onchange_bom_has_bom_inLine(self):
  373. ''' 测试 委外加工单 onchange_bom 存在 物料清单 line_in_ids > 1'''
  374. # has bom_id, line_in_ids > 1
  375. wh_bom = self.env.ref('warehouse.wh_bom_0')
  376. wh_bom.line_parent_ids.create({
  377. 'bom_id': self.env.ref('warehouse.wh_bom_0').id,
  378. 'type': 'parent',
  379. 'goods_id': self.env.ref('goods.cable').id,
  380. 'goods_qty': 1
  381. })
  382. self.outsource_out1.bom_id = wh_bom.id
  383. #self.outsource_out1.onchange_bom()
  384. #self.assertTrue(self.outsource_out1.is_many_to_many_combinations)
  385. def test_outsource_approve_feeding(self):
  386. ''' 测试 委外加工单 审核: 存在委外费用生成结算单 '''
  387. self.outsource_out1.outsource_partner_id = self.env.ref(
  388. 'core.lenovo').id
  389. self.outsource_out1.approve_feeding()
  390. self.outsource_out1.approve_order()
  391. def test_outsource_approve_feeding_no_in_line(self):
  392. ''' 测试 委外加工单 投料:一个明细行没有值 '''
  393. # 当一个明细行没有值时,raise 委外加工单必须存在组合件和子件明细行
  394. self.outsource_out1.line_in_ids.unlink()
  395. with self.assertRaises(UserError):
  396. self.outsource_out1.approve_feeding()
  397. def test_outsource_approve_order_has_fee(self):
  398. ''' 测试 委外加工单 审核: 存在委外费用生成结算单 '''
  399. self.outsource_out1.outsource_partner_id = self.env.ref(
  400. 'core.lenovo').id
  401. self.outsource_out1.outsource_fee = 100
  402. self.outsource_out1.approve_feeding()
  403. self.outsource_out1.approve_order()
  404. def test_outsource_cancel_approved_order(self):
  405. ''' 测试 委外加工单 反审核 '''
  406. self.outsource_out1.outsource_partner_id = self.env.ref(
  407. 'core.lenovo').id
  408. self.outsource_out1.outsource_fee = 100
  409. self.outsource_out1.approve_feeding()
  410. self.outsource_out1.approve_order()
  411. self.outsource_out1.cancel_approved_order()
  412. def test_outsource_unlink(self):
  413. ''' 测试 委外加工单 删除 '''
  414. self.outsource_out1.unlink()
  415. def test_outsource_create(self):
  416. ''' 测试 委外加工单 创建 '''
  417. self.outsource_out1.create({
  418. 'outsource_partner_id': self.env.ref('core.lenovo').id,
  419. 'outsource_fee': 10,
  420. })
  421. def test_outsource_approve_order_no_feeding(self):
  422. ''' 测试 委外加工单 审核 没有投料 就审核 '''
  423. with self.assertRaises(UserError):
  424. self.outsource_out1.approve_order()
  425. def test_disassembly_onchange_goods_qty(self):
  426. ''' 测试 拆卸单 onchange_goods_qty '''
  427. # has bom_id
  428. wh_disassembly_dis3 = self.browse_ref('warehouse.wh_disassembly_dis3')
  429. wh_disassembly_dis3.goods_qty = 1
  430. #wh_disassembly_dis3.onchange_goods_qty()
  431. def test_disassembly_onchange_goods_qty_no_bom(self):
  432. ''' 测试 拆卸单 onchange_goods_qty 没有物料清单 '''
  433. # self.line_out_ids
  434. wh_disassembly_dis3 = self.browse_ref('warehouse.wh_disassembly_dis3')
  435. wh_disassembly_dis3.bom_id = False
  436. wh_disassembly_dis3.goods_id = self.env.ref('goods.keyboard_mouse').id
  437. #wh_disassembly_dis3.onchange_goods_id()
  438. wh_disassembly_dis3.goods_qty = 2
  439. #wh_disassembly_dis3.onchange_goods_qty()
  440. def test_assembly_onchange_bom(self):
  441. ''' 测试 组装单 onchange_bom '''
  442. # no bom_id
  443. wh_assembly_ass0 = self.browse_ref('warehouse.wh_assembly_ass0')
  444. wh_assembly_ass0.onchange_bom()
  445. self.assertEqual(wh_assembly_ass0.goods_qty, 1.0)
  446. def test_assembly_has_bom_id(self):
  447. ''' 测试 组装单 onchange_bom '''
  448. # has bom_id
  449. wh_assembly_ass0 = self.env.ref('warehouse.wh_assembly_ass0')
  450. wh_assembly_ass0.bom_id = self.env.ref('warehouse.wh_bom_0').id
  451. #wh_assembly_ass0.onchange_bom()
  452. def test_assembly_has_bom_line_in(self):
  453. ''' 测试 组装单 bom_id 的组合件 大于 1 '''
  454. # bom_id 的组合件 大于 1行时,len(line_in_ids)>1
  455. wh_assembly_ass0 = self.env.ref('warehouse.wh_assembly_ass0')
  456. wh_bom = self.env.ref('warehouse.wh_bom_0')
  457. wh_bom.type = 'assembly'
  458. wh_bom.line_parent_ids.create({
  459. 'bom_id': self.env.ref('warehouse.wh_bom_0').id,
  460. 'type': 'parent',
  461. 'goods_id': self.env.ref('goods.cable').id,
  462. 'goods_qty': 1
  463. })
  464. wh_assembly_ass0.bom_id = wh_bom.id
  465. #wh_assembly_ass0.onchange_bom()
  466. #self.assertTrue(wh_assembly_ass0.is_many_to_many_combinations)
  467. def test_disassembly_onchange_bom(self):
  468. ''' 测试 拆卸单 onchange_bom '''
  469. # no bom_id
  470. wh_disassembly_dis3 = self.env.ref('warehouse.wh_disassembly_dis3')
  471. wh_disassembly_dis3.bom_id = False
  472. wh_disassembly_dis3.onchange_bom()
  473. self.assertEqual(wh_disassembly_dis3.goods_qty, 1.0)
  474. def test_disassembly_has_bom(self):
  475. ''' 测试拆卸单 存在 bom '''
  476. # has bom_id
  477. wh_disassembly_dis3 = self.env.ref('warehouse.wh_disassembly_dis3')
  478. bom_copy_1 = self.env.ref('warehouse.wh_bom_0').copy()
  479. self.bom_id = bom_copy_1.id
  480. wh_disassembly_dis3.bom_id = bom_copy_1.id
  481. #wh_disassembly_dis3.onchange_bom()
  482. def test_disassembly_has_bom_out_line(self):
  483. ''' 测试拆卸单 bom_id 的组合件 大于 1 '''
  484. # 拆卸单 bom_id 的组合件 大于 1行时,len(line_out_ids)>1
  485. wh_disassembly_dis3 = self.env.ref('warehouse.wh_disassembly_dis3')
  486. wh_bom = self.env.ref('warehouse.wh_bom_0')
  487. wh_bom.line_parent_ids.create({
  488. 'bom_id': self.env.ref('warehouse.wh_bom_0').id,
  489. 'type': 'parent',
  490. 'goods_id': self.env.ref('goods.cable').id,
  491. 'goods_qty': 1
  492. })
  493. self.bom_id = self.disassembly_bom.id
  494. wh_disassembly_dis3.bom_id = wh_bom.id
  495. #wh_disassembly_dis3.onchange_bom()
  496. #self.assertTrue(wh_disassembly_dis3.is_many_to_many_combinations)
  497. def test_disassembly_approve_order_no_feeding(self):
  498. ''' 测试 拆卸单 审核 没有投料 就审核 '''
  499. with self.assertRaises(UserError):
  500. self.disassembly.approve_order()
  501. def test_cancel_approve_order_has_voucher(self):
  502. ''' 测试 拆卸单 反审核 删除发票 '''
  503. self.assembly.approve_feeding()
  504. self.assembly.approve_order()
  505. self.disassembly.approve_feeding()
  506. self.disassembly.approve_order()
  507. self.disassembly.cancel_approved_order()
  508. def test_disassembly_unlink(self):
  509. ''' 测试 拆卸单 删除 '''
  510. self.disassembly.unlink()
  511. def test_assembly_approve_feeding_twice(self):
  512. '''组装单:重复发料和入库报错'''
  513. self.assembly.approve_feeding()
  514. with self.assertRaises(UserError):
  515. self.assembly.approve_feeding()
  516. self.assembly.approve_order()
  517. with self.assertRaises(UserError):
  518. self.assembly.approve_order()
  519. self.assembly.cancel_approved_order()
  520. with self.assertRaises(UserError):
  521. self.assembly.cancel_approved_order()
  522. def test_disassembly_approve_feeding_twice(self):
  523. '''拆卸单:重复发料和入库报错'''
  524. # 先组装,后拆卸可以正常出入库
  525. self.assembly.approve_feeding()
  526. self.assembly.approve_order()
  527. self.disassembly.approve_feeding()
  528. with self.assertRaises(UserError):
  529. self.disassembly.approve_feeding()
  530. self.disassembly.approve_order()
  531. with self.assertRaises(UserError):
  532. self.disassembly.approve_order()
  533. self.disassembly.cancel_approved_order()
  534. with self.assertRaises(UserError):
  535. self.disassembly.cancel_approved_order()
  536. def test_outsource_approve_feeding_twice(self):
  537. '''委外单:重复发料和入库报错'''
  538. self.outsource_out1.approve_feeding()
  539. with self.assertRaises(UserError):
  540. self.outsource_out1.approve_feeding()
  541. self.outsource_out1.approve_order()
  542. with self.assertRaises(UserError):
  543. self.outsource_out1.approve_order()
  544. self.outsource_out1.cancel_approved_order()
  545. with self.assertRaises(UserError):
  546. self.outsource_out1.cancel_approved_order()
  547. class TestWhBom(TransactionCase):
  548. ''' 测试物料清单明细 '''
  549. def setUp(self):
  550. super(TestWhBom, self).setUp()
  551. self.bom = self.env.ref('warehouse.wh_bom_0')
  552. #def test_check_parent_child_unique(self):
  553. '''判断同一个产品不能是组合件又是子件'''
  554. #with self.assertRaises(ValidationError):
  555. # self.bom.write({'line_child_ids': [(0, 0, {'goods_id': self.env.ref('goods.keyboard_mouse').id})]})
  556. class TestWhBomLine(TransactionCase):
  557. ''' 测试物料清单明细 '''
  558. def setUp(self):
  559. super(TestWhBomLine, self).setUp()
  560. self.bom = self.env.ref('warehouse.wh_bom_0')
  561. def test_check_goods_qty(self):
  562. '''验证商品数量大于0'''
  563. with self.assertRaises(UserError):
  564. self.bom.line_child_ids[0].goods_qty = 0
上海开阖软件有限公司 沪ICP备12045867号-1