GoodERP
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

381 lines
16KB

  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 TestWarehouseOrder(TransactionCase):
  7. ''' 测试仓库的其他出库单单据和调拨单 '''
  8. def setUp(self):
  9. super(TestWarehouseOrder, self).setUp()
  10. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  11. 'finance.account_goods').id
  12. self.env.ref('warehouse.wh_in_whin1').date = '2016-02-06'
  13. self.env.ref('warehouse.wh_in_whin3').date = '2016-02-06'
  14. self.env.ref('warehouse.wh_in_whin0').date = '2016-02-06'
  15. self.overage_in = self.browse_ref('warehouse.wh_in_whin0')
  16. self.overage_in_cable = self.browse_ref('warehouse.wh_move_line_14')
  17. self.others_in = self.browse_ref('warehouse.wh_in_whin1')
  18. self.others_in_cable = self.browse_ref('warehouse.wh_move_line_15')
  19. self.others_in_keyboard_mouse = self.browse_ref(
  20. 'warehouse.wh_move_line_16')
  21. self.others_in_2 = self.browse_ref('warehouse.wh_in_whin3')
  22. self.others_in_2_keyboard_mouse = self.browse_ref(
  23. 'warehouse.wh_move_line_keyboard_mouse_in_2')
  24. self.others_in_keyboard_mouse = self.browse_ref(
  25. 'warehouse.wh_move_line_16')
  26. self.others_out = self.browse_ref('warehouse.wh_out_whout0')
  27. self.others_out_2 = self.browse_ref('warehouse.wh_out_whout1')
  28. self.internal = self.browse_ref('warehouse.wh_internal_whint0')
  29. # 其他入库调拨网线48个和键鼠套装48个到总仓
  30. self.others_in.approve_order()
  31. # 睡眠2秒,使得下一次入库的确认时间和上次入库不一致
  32. time.sleep(2)
  33. # 其他入库键鼠套装48个到总仓
  34. self.others_in_2.approve_order()
  35. # 盘盈入库调拨网线12000个到总仓
  36. self.overage_in.approve_order()
  37. # 将120个网线从总仓调拨到上海仓库
  38. self.internal.approve_order()
  39. for _l in self.env['wh.move.line'].search([('state', '=', 'done')]):
  40. _logger.info('%s %s +%s' % (
  41. _l.goods_id.name, _l.warehouse_dest_id.name, _l.goods_qty))
  42. # 将12个网线从上海仓库发往其他仓库
  43. self.others_out.approve_order()
  44. # 将24个键盘套装从总仓发往其他仓库
  45. self.others_out_2.approve_order()
  46. for _l in self.env['wh.move.line'].search([('state', '=', 'done')]):
  47. _logger.info('%s %s +%s' % (
  48. _l.goods_id.name, _l.warehouse_dest_id.name, _l.goods_qty))
  49. def test_approve(self):
  50. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  51. 'finance.account_goods').id
  52. # 此时其他入库单的others_in的剩余数量应该为0
  53. self.assertEqual(self.others_in_cable.qty_remaining, 0)
  54. # 此时盘盈入库单的overage_in的剩余数量应该为12000 - 120 + 48
  55. self.assertEqual(self.overage_in_cable.qty_remaining, 12000 - 120 + 48)
  56. # 此时调拨单上的剩余数量应该位120 - 12
  57. self.assertEqual(self.internal.line_out_ids.qty_remaining, 120 - 12)
  58. # 根据FIFO原则,应该先取先入库的商品,所以先取others_in的前24个键盘套装
  59. self.assertEqual(self.others_in_keyboard_mouse.qty_remaining, 24)
  60. self.assertEqual(self.others_in_2_keyboard_mouse.qty_remaining, 48)
  61. # 所有审核后的单据状态都应该为done
  62. self.assertEqual(self.overage_in.state, 'done')
  63. self.assertEqual(self.others_in.state, 'done')
  64. self.assertEqual(self.others_in_2.state, 'done')
  65. self.assertEqual(self.others_out.state, 'done')
  66. self.assertEqual(self.others_out_2.state, 'done')
  67. self.assertEqual(self.internal.state, 'done')
  68. def test_approve_create_zero_wh_in(self):
  69. ''' 测试 create_zero_wh_in '''
  70. self.others_out.cancel_approved_order()
  71. self.internal.cancel_approved_order()
  72. self.env.user.company_id.is_enable_negative_stock = True
  73. self.env.ref('warehouse.wh_move_line_17').goods_qty = 20000
  74. def test_unlink(self):
  75. # 审核后的单据无法被取消
  76. with self.assertRaises(UserError):
  77. self.others_in.unlink()
  78. # 审核后的单据无法被取消
  79. with self.assertRaises(UserError):
  80. self.overage_in.unlink()
  81. # 审核后的单据无法被取消
  82. with self.assertRaises(UserError):
  83. self.internal.unlink()
  84. # 审核后的单据无法被取消
  85. with self.assertRaises(UserError):
  86. self.others_out.unlink()
  87. self.others_out.cancel_approved_order()
  88. self.others_out_2.cancel_approved_order()
  89. self.internal.cancel_approved_order()
  90. self.overage_in.cancel_approved_order()
  91. self.others_in.cancel_approved_order()
  92. # 取消后的单据可以被删除
  93. self.others_in.unlink()
  94. self.others_out_2.unlink()
  95. self.overage_in.unlink()
  96. self.internal.unlink()
  97. self.others_out.unlink()
  98. # 删除后的单据应该不存在
  99. self.assertTrue(not self.others_in.exists())
  100. self.assertTrue(not self.others_out_2.exists())
  101. self.assertTrue(not self.overage_in.exists())
  102. self.assertTrue(not self.internal.exists())
  103. self.assertTrue(not self.others_out.exists())
  104. def test_cancel_approve_line_action_draft(self):
  105. # 存在已经被匹配的出库时入库无法被取消
  106. with self.assertRaises(UserError):
  107. self.others_in.cancel_approved_order()
  108. def test_cancel_approve(self):
  109. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  110. 'finance.account_goods').id
  111. # 取消键盘套装的出库,此时others_in的键盘套装数量回复到48
  112. self.others_out_2.cancel_approved_order()
  113. self.assertEqual(self.others_in_keyboard_mouse.qty_remaining, 48)
  114. # 出库单据审核后剩余数量需要减去出库数量12
  115. self.assertEqual(self.internal.line_out_ids.qty_remaining, 120 - 12)
  116. self.others_out.cancel_approved_order()
  117. # 出库单据反审核后剩余数量会恢复为120
  118. self.assertEqual(self.internal.line_out_ids.qty_remaining, 120)
  119. self.assertEqual(self.others_in_cable.qty_remaining, 0)
  120. self.assertEqual(self.overage_in_cable.qty_remaining, 12000 - 120 + 48)
  121. self.internal.cancel_approved_order()
  122. self.assertEqual(self.others_in_cable.qty_remaining, 48)
  123. self.assertEqual(self.overage_in_cable.qty_remaining, 12000)
  124. self.overage_in.cancel_approved_order()
  125. self.others_in.cancel_approved_order()
  126. # 所有反审核后的单据状态都应该为draft
  127. self.assertEqual(self.overage_in.state, 'draft')
  128. self.assertEqual(self.others_in.state, 'draft')
  129. self.assertEqual(self.others_out.state, 'draft')
  130. self.assertEqual(self.internal.state, 'draft')
  131. # 没有明细行的单据不可以被审核通过
  132. with self.assertRaises(UserError):
  133. self.internal.line_out_ids.unlink()
  134. self.internal.approve_order()
  135. def test_origin(self):
  136. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  137. 'finance.account_goods').id
  138. self.assertEqual(self.others_in.origin, 'wh.in.others')
  139. self.assertEqual(self.others_out.origin, 'wh.out.others')
  140. self.assertEqual(self.internal.origin, 'wh.internal')
  141. self.assertEqual(self.overage_in.origin, 'wh.in.inventory')
  142. def test_create(self):
  143. temp_out = self.env['wh.out'].create({'name': '/', 'type': 'others'})
  144. temp_in = self.env['wh.in'].create({'name': '/', 'type': 'others'})
  145. temp_internal = self.env['wh.internal'].create({'name': '/'})
  146. self.assertNotEqual(temp_out.name, '/')
  147. self.assertNotEqual(temp_in.name, '/')
  148. self.assertNotEqual(temp_internal.name, '/')
  149. self.assertEqual(temp_out.origin, 'wh.out.others')
  150. self.assertEqual(temp_in.origin, 'wh.in.others')
  151. self.assertEqual(temp_internal.origin, 'wh.internal')
  152. def test_get_default_warehouse(self):
  153. '''获取调出仓库'''
  154. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  155. 'finance.account_goods').id
  156. order = self.env['wh.out'].with_context({
  157. 'warehouse_type': 'stock',
  158. }).create({'type': 'others',
  159. 'line_out_ids': [(0, 0, {'goods_id': self.browse_ref('goods.mouse').id,
  160. 'type': 'out',
  161. })]})
  162. # 验证明细行上仓库是否是订单上调出仓库
  163. hd_stock = self.browse_ref('warehouse.hd_stock')
  164. order.warehouse_id = hd_stock
  165. line = order.line_out_ids[0]
  166. #self.assertTrue(line.warehouse_id == hd_stock)
  167. self.env['wh.out'].create({'type': 'others'})
  168. def test_get_default_warehouse_dest(self):
  169. '''获取调入仓库'''
  170. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  171. 'finance.account_goods').id
  172. order = self.env['wh.in'].with_context({
  173. 'warehouse_dest_type': 'stock'
  174. }).create({'type': 'others',
  175. 'line_in_ids': [(0, 0, {'goods_id': self.browse_ref('goods.mouse').id})]})
  176. # 验证明细行上仓库是否是订单上调入仓库
  177. hd_stock = self.browse_ref('warehouse.hd_stock')
  178. order.warehouse_dest_id = hd_stock
  179. line = order.line_in_ids[0]
  180. self.assertTrue(line.warehouse_dest_id == hd_stock)
  181. self.env['wh.in'].create({'type': 'others'})
  182. def test_onchange_type(self):
  183. '''当业务类别变化时,调入库位也发生变化'''
  184. # 其它出库单
  185. self.others_out.type = 'inventory'
  186. warehouse_inventory = self.browse_ref('warehouse.warehouse_inventory')
  187. self.others_out.onchange_type()
  188. self.assertTrue(self.others_out.warehouse_dest_id ==
  189. warehouse_inventory)
  190. # 其它入库单
  191. self.others_in_2.type = 'inventory'
  192. self.others_in_2.onchange_type()
  193. self.assertTrue(self.others_in_2.warehouse_id == warehouse_inventory)
  194. def test_create_voucher_init(self):
  195. '''初始化其他入库单时生成凭证的情况'''
  196. self.others_in_2.cancel_approved_order()
  197. self.others_in_2.is_init = True
  198. self.others_in_2.approve_order()
  199. self.others_in_2.cancel_approved_order()
  200. def test_create_voucher_no_voucher_line(self):
  201. '''确认其他入库单时生成凭证 没有凭证行,删除凭证 的情况'''
  202. self.others_in_2.cancel_approved_order()
  203. self.others_in_2_keyboard_mouse.cost = 0.0
  204. self.others_in_2.approve_order()
  205. # 键鼠套装入库成本为0再出库时,没有凭证行,删除凭证行
  206. self.others_out.cancel_approved_order()
  207. self.internal.cancel_approved_order()
  208. self.others_out_2.cancel_approved_order()
  209. self.others_in.cancel_approved_order() # 为了键鼠套装入库成本为0,匹配到others_in_2
  210. self.env.ref('warehouse.wh_move_line_out_2').cost = 0.0
  211. self.others_out_2.approve_order()
  212. #def test_voucher_can_be_draft(self):
  213. '''其他单据生成的凭证不能反审核'''
  214. #voucher = self.env.ref('finance.voucher_1')
  215. #voucher.ref = 'wh.in,1'
  216. #voucher.voucher_done()
  217. #with self.assertRaises(UserError):
  218. #voucher.voucher_can_be_draft()
  219. def test_goods_inventory_others_out(self):
  220. ''' 其他出库单审核商品不足时调用创建盘盈入库方法 '''
  221. self.others_out.cancel_approved_order()
  222. for line in self.others_out.line_out_ids:
  223. vals = {
  224. 'type': 'inventory',
  225. 'warehouse_id': self.env.ref('warehouse.warehouse_inventory').id,
  226. 'warehouse_dest_id': self.others_out.warehouse_id.id,
  227. 'line_in_ids': [(0, 0, {
  228. 'goods_id': line.goods_id.id,
  229. 'attribute_id': line.attribute_id.id,
  230. 'goods_uos_qty': line.goods_uos_qty,
  231. 'uos_id': line.uos_id.id,
  232. 'goods_qty': line.goods_qty,
  233. 'uom_id': line.uom_id.id,
  234. 'cost_unit': line.goods_id.cost
  235. }
  236. )]
  237. }
  238. self.others_out.goods_inventory(vals)
  239. def test_goods_inventory_internal(self):
  240. ''' 内部调拨单审核商品不足时调用创建盘盈入库方法 '''
  241. self.others_out.cancel_approved_order()
  242. self.internal.cancel_approved_order()
  243. for line in self.internal.line_out_ids:
  244. vals = {
  245. 'type': 'inventory',
  246. 'warehouse_id': self.env.ref('warehouse.warehouse_inventory').id,
  247. 'warehouse_dest_id': self.internal.warehouse_id.id,
  248. 'line_in_ids': [(0, 0, {
  249. 'goods_id': line.goods_id.id,
  250. 'attribute_id': line.attribute_id.id,
  251. 'goods_uos_qty': line.goods_uos_qty,
  252. 'uos_id': line.uos_id.id,
  253. 'goods_qty': line.goods_qty,
  254. 'uom_id': line.uom_id.id,
  255. 'cost_unit': line.goods_id.cost
  256. }
  257. )]
  258. }
  259. self.internal.goods_inventory(vals)
  260. def test_approve_order_twice(self):
  261. '''重复确认报错'''
  262. with self.assertRaises(UserError):
  263. self.others_in.approve_order()
  264. with self.assertRaises(UserError):
  265. self.internal.approve_order()
  266. with self.assertRaises(UserError):
  267. self.others_out.approve_order()
  268. def test_cancel_approved_order_twice(self):
  269. '''重复撤销报错'''
  270. self.others_in_2.cancel_approved_order()
  271. with self.assertRaises(UserError):
  272. self.others_in_2.cancel_approved_order()
  273. self.others_out.cancel_approved_order()
  274. with self.assertRaises(UserError):
  275. self.others_out.cancel_approved_order()
  276. self.internal.cancel_approved_order()
  277. with self.assertRaises(UserError):
  278. self.internal.cancel_approved_order()
  279. def test_scan_barcode(self):
  280. comp_barcode = self.env.ref('goods.computer').barcode
  281. self.others_out.on_barcode_scanned(comp_barcode)
  282. class TestCheckOutWizard(TransactionCase):
  283. # 放在这里测试,因为代码实现时,需要安装 warehouse 模块
  284. def test_button_checkout_diff_cost(self):
  285. ''' Test button_checkout:diff_cost '''
  286. # 期初 keyboard_mouse 产品数量及成本
  287. self.env.ref('finance.period_201411').is_closed = False
  288. self.env.ref('warehouse.wh_in_whin1').date = '2014-11-06'
  289. self.env.ref('warehouse.wh_move_line_16').cost = 600
  290. self.browse_ref('warehouse.wh_in_whin1').approve_order() # 入库 48
  291. others_out_1 = self.env.ref('warehouse.wh_out_whout1')
  292. others_out_1.date = '2014-11-06'
  293. others_out_1.approve_order() # 出库 24
  294. self.env.ref('finance.period_201411').is_closed = True
  295. # 当月入库 keyboard_mouse 产品数量及成本
  296. self.env.ref('warehouse.wh_in_whin3').date = '2014-12-06'
  297. self.env.ref('warehouse.wh_move_line_keyboard_mouse_in_2').cost = 400
  298. self.browse_ref('warehouse.wh_in_whin3').approve_order()
  299. # 当月出库
  300. others_out_2 = self.env.ref('warehouse.wh_out_whout1').copy()
  301. others_out_2.date = '2014-12-06'
  302. others_out_2.approve_order()
  303. # 月末结账
  304. wizard_2 = self.env['checkout.wizard'].create({'date': '2014-12-13'})
  305. wizard_2.onchange_period_id()
  306. self.env['month.product.cost'].generate_issue_cost(wizard_2.period_id, wizard_2.date)
  307. self.env.ref('finance.period_201412').is_closed = True
  308. # 发出成本算法为 定额成本std
  309. others_out_3 = self.env.ref('warehouse.wh_out_whout1').copy()
  310. others_out_3.date = '2015-12-06'
  311. self.env.ref('goods.keyboard_mouse').cost_method = 'std'
  312. others_out_3.approve_order()
  313. # 月末结账
  314. wizard_3 = self.env['checkout.wizard'].create({'date': '2015-12-13'})
  315. wizard_3.onchange_period_id()
  316. self.env['month.product.cost'].generate_issue_cost(wizard_3.period_id, wizard_3.date)
上海开阖软件有限公司 沪ICP备12045867号-1