GoodERP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

503 lines
21KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo.tests.common import TransactionCase
  4. from odoo.exceptions import UserError
  5. class TestBuyReceipt(TransactionCase):
  6. def setUp(self):
  7. super(TestBuyReceipt, self).setUp()
  8. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  9. 'finance.account_goods').id
  10. self.order = self.env.ref('buy.buy_order_1')
  11. self.order.bank_account_id = False
  12. self.order.buy_order_done()
  13. self.receipt = self.env['buy.receipt'].search(
  14. [('order_id', '=', self.order.id)])
  15. self.return_receipt = self.env.ref('buy.buy_receipt_return_1')
  16. self.env.ref('warehouse.wh_in_whin0').date = '2016-02-06'
  17. warehouse_obj = self.env.ref('warehouse.wh_in_whin0')
  18. warehouse_obj.approve_order()
  19. self.bank_account = self.env.ref('core.alipay')
  20. self.bank_account.balance = 10000
  21. self.goods = self.env.ref('goods.cable')
  22. # 因同一个业务伙伴不能存在两张未审核的收付款单,把系统里已有的相关业务伙伴未审核的收付款单审核
  23. self.env.ref('money.get_40000').money_order_done()
  24. self.env.ref('money.pay_2000').money_order_done()
  25. def test_compute_all_amount(self):
  26. '''测试当优惠金额改变时,改变成交金额'''
  27. self.receipt.discount_amount = 5
  28. self.assertTrue(self.receipt.amount == 580)
  29. def test_get_buy_money_state(self):
  30. '''测试返回付款状态'''
  31. self.receipt.buy_receipt_done()
  32. self.receipt._get_buy_money_state()
  33. self.assertTrue(self.receipt.money_state == '未付款')
  34. receipt = self.receipt.copy()
  35. receipt.payment = receipt.amount - 1
  36. receipt.bank_account_id = self.bank_account
  37. receipt.buy_receipt_done()
  38. # 查找产生的付款单,并审核
  39. source_line = self.env['source.order.line'].search(
  40. [('name', '=', receipt.invoice_id.id)])
  41. for line in source_line:
  42. line.money_id.money_order_done()
  43. # 判断状态
  44. receipt._get_buy_money_state()
  45. self.assertTrue(receipt.money_state == '部分付款')
  46. receipt = self.receipt.copy()
  47. receipt.payment = receipt.amount
  48. receipt.bank_account_id = self.bank_account
  49. receipt.buy_receipt_done()
  50. # 查找产生的付款单,并审核
  51. source_line = self.env['source.order.line'].search(
  52. [('name', '=', receipt.invoice_id.id)])
  53. for line in source_line:
  54. line.money_id.money_order_done()
  55. # 判断状态
  56. receipt._get_buy_money_state()
  57. self.assertTrue(receipt.money_state == '全部付款')
  58. def test_get_buy_money_state_return(self):
  59. '''测试返回退款状态'''
  60. self.return_receipt._get_buy_money_state()
  61. self.return_receipt.buy_receipt_done()
  62. self.return_receipt._get_buy_money_state()
  63. self.assertTrue(self.return_receipt.return_state == '未退款')
  64. return_receipt = self.return_receipt.copy()
  65. return_receipt.payment = return_receipt.amount - 1
  66. return_receipt.bank_account_id = self.bank_account
  67. return_receipt.buy_receipt_done()
  68. # 查找产生的付款单,并审核
  69. source_line = self.env['source.order.line'].search(
  70. [('name', '=', return_receipt.invoice_id.id)])
  71. for line in source_line:
  72. line.money_id.money_order_done()
  73. # 判断状态
  74. return_receipt._get_buy_money_state()
  75. self.assertTrue(return_receipt.return_state == '部分退款')
  76. return_receipt = self.return_receipt.copy()
  77. return_receipt.payment = return_receipt.amount
  78. return_receipt.bank_account_id = self.bank_account
  79. return_receipt.buy_receipt_done()
  80. # 查找产生的付款单,并审核
  81. source_line = self.env['source.order.line'].search(
  82. [('name', '=', return_receipt.invoice_id.id)])
  83. for line in source_line:
  84. line.money_id.money_order_done()
  85. # 判断状态
  86. return_receipt._get_buy_money_state()
  87. self.assertTrue(return_receipt.return_state == '全部退款')
  88. def test_onchange_discount_rate(self):
  89. '''测试优惠率改变时,优惠金额改变'''
  90. self.receipt.discount_rate = 10
  91. self.receipt.onchange_discount_rate()
  92. self.assertTrue(self.receipt.amount == 526.5)
  93. self.return_receipt.discount_rate = 10
  94. self.return_receipt.onchange_discount_rate()
  95. self.assertTrue(self.receipt.amount == 526.5)
  96. def test_create(self):
  97. '''创建采购入库单时生成有序编号'''
  98. receipt = self.env['buy.receipt'].create({
  99. })
  100. self.assertTrue(receipt.origin == 'buy.receipt.buy')
  101. receipt = self.env['buy.receipt'].with_context({
  102. 'is_return': True
  103. }).create({
  104. })
  105. self.assertTrue(receipt.origin == 'buy.receipt.return')
  106. def test_unlink(self):
  107. '''测试删除采购入库/退货单'''
  108. # 测试是否可以删除已审核的单据
  109. self.receipt.buy_receipt_done()
  110. with self.assertRaises(UserError):
  111. self.receipt.unlink()
  112. # 反审核采购订单,测试删除buy_receipt时是否可以删除关联的wh.move.line记录
  113. self.receipt.buy_receipt_draft()
  114. move_id = self.receipt.buy_move_id.id
  115. self.order.buy_order_draft()
  116. move = self.env['wh.move'].search(
  117. [('id', '=', move_id)])
  118. self.assertTrue(not move)
  119. self.assertTrue(not move.line_in_ids)
  120. def test_buy_receipt_done(self):
  121. '''审核采购入库单/退货单,更新本单的付款状态/退款状态,并生成结算单和付款单'''
  122. # 结算账户余额
  123. bank_account = self.env.ref('core.alipay')
  124. bank_account.write({'balance': 1000000, })
  125. receipt = self.receipt.copy()
  126. # 付款额不为空时,请选择结算账户
  127. self.receipt.payment = 100
  128. with self.assertRaises(UserError):
  129. self.receipt.buy_receipt_done()
  130. # 付款金额不能大于折后金额!
  131. self.receipt.bank_account_id = bank_account
  132. self.receipt.payment = 20000
  133. with self.assertRaises(UserError):
  134. self.receipt.buy_receipt_done()
  135. # 入库单审核时未填数量应报错
  136. for line in self.receipt.line_in_ids:
  137. line.goods_qty = 0
  138. with self.assertRaises(UserError):
  139. self.receipt.buy_receipt_done()
  140. # 采购退货单审核时未填数量应报错
  141. for line in self.return_receipt.line_out_ids:
  142. line.goods_qty = 0
  143. with self.assertRaises(UserError):
  144. self.return_receipt.buy_receipt_done()
  145. # 重复审核入库单报错
  146. self.receipt.bank_account_id = None
  147. self.receipt.payment = 0
  148. for line in self.receipt.line_in_ids:
  149. line.goods_qty = 1
  150. self.receipt.buy_receipt_done()
  151. with self.assertRaises(UserError):
  152. self.receipt.buy_receipt_done()
  153. # 重复审核退货单报错
  154. for line in self.return_receipt.line_out_ids:
  155. line.goods_qty = 1
  156. self.return_receipt.buy_receipt_done()
  157. with self.assertRaises(UserError):
  158. self.return_receipt.buy_receipt_done()
  159. # 入库单上的采购费用分摊到入库单明细行上
  160. receipt.cost_line_ids.create({
  161. 'buy_id': receipt.id,
  162. 'category_id': self.env.ref('core.cat_consult').id,
  163. 'partner_id': 4,
  164. 'amount': 100, })
  165. # 测试分摊之前审核是否会弹出警告
  166. with self.assertRaises(UserError):
  167. receipt.buy_receipt_done()
  168. # 测试分摊之后金额是否相等,然后审核,测试采购费用是否产生结算单
  169. receipt.buy_share_cost()
  170. receipt.buy_receipt_done()
  171. for line in receipt.line_in_ids:
  172. self.assertTrue(line.share_cost == 100)
  173. self.assertTrue(line.using_attribute)
  174. def test_wrong_receipt_done_lot_unique_current(self):
  175. '''审核时,当前入库单行之间同一商品批号不能相同'''
  176. receipt = self.env['buy.receipt'].create({
  177. 'partner_id': self.env.ref('core.lenovo').id,
  178. 'date': '2016-09-01',
  179. 'date_due': '2016-09-05',
  180. 'warehouse_dest_id': self.env.ref('warehouse.bj_stock').id,
  181. 'line_in_ids': [
  182. (0, 0, {
  183. 'goods_id': self.env.ref('goods.mouse').id,
  184. 'lot': 'lot_1',
  185. 'goods_qty': 1.0}),
  186. (0, 0, {
  187. 'goods_id': self.env.ref('goods.mouse').id,
  188. 'lot': 'lot_1',
  189. 'goods_qty': 1.0})
  190. ]
  191. })
  192. with self.assertRaises(UserError):
  193. receipt.buy_receipt_done()
  194. def test_wrong_receipt_done_lot_unique_wh(self):
  195. '''审核时,当前入库单行与仓库里同一商品批号不能相同'''
  196. receipt = self.env['buy.receipt'].create({
  197. 'partner_id': self.env.ref('core.lenovo').id,
  198. 'date': '2016-09-01',
  199. 'date_due': '2016-09-05',
  200. 'warehouse_dest_id': self.env.ref('warehouse.bj_stock').id,
  201. 'line_in_ids': [(0, 0, {
  202. 'goods_id': self.env.ref('goods.mouse').id,
  203. 'lot': 'lot_1',
  204. 'goods_qty': 1.0,
  205. 'state': 'done'})]
  206. })
  207. with self.assertRaises(UserError):
  208. receipt.buy_receipt_done()
  209. def test_wrong_receipt_done_amount_less_than_zero(self):
  210. ''' 测试 采购/退货金额不能小于 0 '''
  211. for line in self.receipt.line_in_ids: # 采购金额不能小于 0
  212. line.price_taxed = 0.0
  213. line.cost_unit = 0.0
  214. line.discount_amount = 10.0
  215. with self.assertRaises(UserError):
  216. self.receipt.buy_receipt_done()
  217. for line in self.return_receipt.line_out_ids: # 退货金额不能小于 0
  218. line.price_taxed = 0.0
  219. line.cost_unit = 0.0
  220. line.discount_amount = 10.0
  221. with self.assertRaises(UserError):
  222. self.return_receipt.buy_receipt_done()
  223. def test_receipt_done_no_voucher(self):
  224. ''' 测试 采购入库单 没有凭证行 删除凭证 '''
  225. for line in self.receipt.line_in_ids:
  226. line.price_taxed = 0.0
  227. line.cost_unit = 0.0
  228. #self.receipt.buy_receipt_done()
  229. def test_receipt_make_invoice(self):
  230. '''审核入库单:不勾按收货结算时'''
  231. self.order.buy_order_draft()
  232. self.order.invoice_by_receipt = False
  233. self.order.buy_order_done()
  234. receipt = self.env['buy.receipt'].search(
  235. [('order_id', '=', self.order.id)])
  236. receipt.buy_receipt_done()
  237. def test_buy_receipt_draft(self):
  238. '''反审核采购入库单/退货单'''
  239. # 先审核入库单,再反审核
  240. self.receipt.bank_account_id = self.bank_account.id
  241. self.receipt.payment = 100
  242. for line in self.receipt.line_in_ids:
  243. line.goods_qty = 2
  244. self.receipt.buy_receipt_done()
  245. # 修改入库单,再次审核,并不产生分单
  246. '''
  247. self.receipt.buy_receipt_draft()
  248. for line in self.receipt.line_in_ids:
  249. line.goods_qty = 3
  250. self.receipt.buy_receipt_done()
  251. receipt = self.env['buy.receipt'].search(
  252. [('order_id', '=', self.order.id)])
  253. self.assertTrue(len(receipt) == 2)
  254. '''
  255. def test_buy_receipt_draft_handle_money_order(self):
  256. '''buy receipt_draft: handle money order in different situations'''
  257. # 先审核入库单,再反审核
  258. self.receipt.bank_account_id = self.bank_account.id
  259. self.receipt.payment = 100
  260. for line in self.receipt.line_in_ids:
  261. line.goods_qty = 2
  262. self.receipt.buy_receipt_done()
  263. '''
  264. # 修改入库单,再次审核,并不产生分单
  265. self.receipt.buy_receipt_draft()
  266. for line in self.receipt.line_in_ids:
  267. line.goods_qty = 3
  268. self.receipt.buy_receipt_done()
  269. receipts = self.env['buy.receipt'].search(
  270. [('order_id', '=', self.order.id)])
  271. for receipt in receipts:
  272. if receipt.state != 'done':
  273. receipt.buy_receipt_done()
  274. money_orders = self.env['money.order'].search([('partner_id', '=', self.env.ref('core.lenovo').id),
  275. ('state', '=', 'draft')])
  276. for m in money_orders:
  277. m.money_order_done()
  278. # 建入库单对应的付款单
  279. money_order = self.env['money.order'].with_context({'type': 'pay'}).create({
  280. 'partner_id': self.env.ref('core.lenovo').id,
  281. 'line_ids': [(0, 0, {
  282. 'bank_id': self.env.ref('core.comm').id,
  283. 'amount': 300.0})]
  284. })
  285. money_order.onchange_partner_id()
  286. # 反审核采购入库单
  287. receipts and receipts[0].buy_receipt_draft() # 付款单 源单行 有别的行存在
  288. len(receipts) > 1 and receipts[1].buy_receipt_draft() # 付款单 源单行 不存在别的行
  289. '''
  290. def test_buy_receipt_draft_quantity_in(self):
  291. '''反审核入库单时,回写采购订单行已执行数量'''
  292. # 退货类型的采购订单生成的采购退货单的反审核
  293. self.receipt.buy_receipt_done()
  294. order = self.env.ref('buy.buy_return_order_1')
  295. # order.bank_account_id = False
  296. order.buy_order_done()
  297. return_receipt = self.env['buy.receipt'].search(
  298. [('order_id', '=', order.id)])
  299. return_receipt.buy_receipt_done()
  300. return_receipt.buy_receipt_draft()
  301. self.assertEqual(return_receipt.line_out_ids[0].buy_line_id.quantity_in, 0.0)
  302. # 采购类型的采购订单生成的采购入库单,生成退货单的反审核
  303. return_dict = self.receipt.buy_to_return()
  304. return_order = self.env['buy.receipt'].search(
  305. [('id', '=', return_dict['res_id'])])
  306. return_order.line_out_ids[0].goods_qty = 3
  307. return_order.buy_receipt_done()
  308. return_order.buy_receipt_draft()
  309. self.assertEqual(return_order.line_out_ids[0].buy_line_id.quantity_in, 10.0)
  310. def test_buy_receipt_draft_twice(self):
  311. '''两次审核和反审核应报错'''
  312. with self.assertRaises(UserError):
  313. self.receipt.buy_receipt_draft()
  314. self.receipt.buy_receipt_done()
  315. with self.assertRaises(UserError):
  316. self.receipt.buy_receipt_done()
  317. def test_scan_barcode(self):
  318. '''采购扫码出入库'''
  319. warehouse = self.env['wh.move']
  320. barcode = '12345678987'
  321. model_name = 'buy.receipt'
  322. # 采购出库单扫码
  323. buy_order_return = self.env.ref('buy.buy_receipt_return_1')
  324. warehouse.scan_barcode(model_name, barcode, buy_order_return.id)
  325. warehouse.scan_barcode(model_name, barcode, buy_order_return.id)
  326. # 采购入库单扫码
  327. warehouse.scan_barcode(model_name, barcode, self.receipt.id)
  328. warehouse.scan_barcode(model_name, barcode, self.receipt.id)
  329. # 商品的条形码扫码出入库
  330. barcode = '123456789'
  331. # 采购入库单扫码
  332. warehouse.scan_barcode(model_name, barcode, self.receipt.id)
  333. warehouse.scan_barcode(model_name, barcode, self.receipt.id)
  334. # 采购退货单扫码
  335. buy_order_return = self.env.ref('buy.buy_receipt_return_1')
  336. warehouse.scan_barcode(model_name, barcode, buy_order_return.id)
  337. warehouse.scan_barcode(model_name, barcode, buy_order_return.id)
  338. def test_onchange_partner_id(self):
  339. ''' 测试 改变 partner, 入库单行商品税率变化 '''
  340. # partner 无 税率,入库单行商品无税率
  341. self.env.ref('core.lenovo').tax_rate = 0
  342. self.env.ref('goods.keyboard').tax_rate = 0
  343. self.receipt.onchange_partner_id()
  344. # partner 有 税率,入库单行商品无税率
  345. self.env.ref('core.lenovo').tax_rate = 10
  346. self.env.ref('goods.keyboard').tax_rate = 0
  347. self.receipt.onchange_partner_id()
  348. # partner 无税率,入库单行商品无税率
  349. self.env.ref('core.lenovo').tax_rate = 0
  350. self.env.ref('goods.keyboard').tax_rate = 10
  351. self.receipt.onchange_partner_id()
  352. # partner 税率 > 入库单行商品税率
  353. self.env.ref('core.lenovo').tax_rate = 11
  354. self.env.ref('goods.keyboard').tax_rate = 10
  355. self.receipt.onchange_partner_id()
  356. # partner 税率 =< 入库单行商品税率
  357. self.env.ref('core.lenovo').tax_rate = 11
  358. self.env.ref('goods.keyboard').tax_rate = 12
  359. self.receipt.onchange_partner_id()
  360. def test_buy_receipt_done_currency(self):
  361. """入库单选择外币时审核"""
  362. self.order.buy_order_draft()
  363. self.order.currency_id = self.env.ref('base.USD')
  364. for line in self.order.line_ids:
  365. line.tax_rate = 0
  366. self.order.buy_order_done()
  367. self.receipt = self.env['buy.receipt'].search(
  368. [('order_id', '=', self.order.id)])
  369. self.receipt.buy_receipt_done()
  370. def test_buy_to_return(self):
  371. '''采购入库单转化为采购退货单'''
  372. #self.receipt.line_in_ids[0].copy()
  373. self.receipt.buy_receipt_done()
  374. self.receipt.buy_to_return()
  375. with self.assertRaises(UserError):
  376. self.receipt.buy_to_return()
  377. # 该订单已全部退货,再次点击按钮则报错
  378. return_order = self.env['buy.receipt'].search([
  379. ('is_return', '=', True),
  380. ('origin_id', '=', self.receipt.id),
  381. ])
  382. return_order.buy_receipt_done()
  383. with self.assertRaises(UserError):
  384. self.receipt.buy_to_return()
  385. def test_buy_to_return_using_batch(self):
  386. ''' 采购入库单转化为采购退货单:订单行产品进行了批次管理 '''
  387. self.receipt.line_in_ids[0].goods_id.using_batch = True
  388. self.receipt.line_in_ids[0].lot = '1'
  389. #self.receipt.line_in_ids[0].copy()
  390. #self.receipt.buy_receipt_done()
  391. #self.receipt.buy_to_return()
  392. def test_buy_receipt_done_return_order_has_payment(self):
  393. ''' 有付款的采购退货单 系统认为是纯退货,不再生成草稿状态的发货单 '''
  394. #self.receipt.line_in_ids[0].copy()
  395. self.receipt.buy_receipt_done()
  396. self.receipt.buy_to_return()
  397. return_order = self.env['buy.receipt'].search([
  398. ('is_return', '=', True),
  399. ('origin_id', '=', self.receipt.id),
  400. ])
  401. return_order.payment = 2
  402. return_order.bank_account_id = self.bank_account.id
  403. return_order.buy_receipt_done()
  404. class TestWhMoveLine(TransactionCase):
  405. def setUp(self):
  406. '''准备基本数据'''
  407. super(TestWhMoveLine, self).setUp()
  408. self.order = self.env.ref('buy.buy_order_1')
  409. self.order.bank_account_id = False
  410. self.order.buy_order_done()
  411. self.receipt = self.env['buy.receipt'].search(
  412. [('order_id', '=', self.order.id)])
  413. self.return_receipt = self.env.ref('buy.buy_receipt_return_1')
  414. self.goods_mouse = self.browse_ref('goods.mouse')
  415. def test_onchange_goods_id(self):
  416. '''测试采购模块中商品的onchange,是否会带出单价'''
  417. for line in self.receipt.line_in_ids:
  418. line.onchange_goods_id()
  419. # 采购退货单行
  420. for line in self.return_receipt.line_out_ids:
  421. line.goods_id.cost = 1.0
  422. line.with_context({'default_is_return': True,
  423. 'default_partner': self.return_receipt.partner_id.id}).onchange_goods_id()
  424. def test_onchange_goods_id_tax_rate(self):
  425. ''' 测试 修改商品时,入库单行税率变化 '''
  426. self.receipt.partner_id = self.env.ref('core.lenovo')
  427. for order_line in self.receipt.line_in_ids:
  428. # partner 无 税率,入库单行商品无税率
  429. self.env.ref('core.lenovo').tax_rate = 0
  430. self.env.ref('goods.keyboard').tax_rate = 0
  431. order_line.with_context(
  432. {'default_partner': self.receipt.partner_id.id}).onchange_goods_id()
  433. # partner 有 税率,入库单行商品无税率
  434. self.env.ref('core.lenovo').tax_rate = 10
  435. self.env.ref('goods.keyboard').tax_rate = 0
  436. order_line.with_context(
  437. {'default_partner': self.receipt.partner_id.id}).onchange_goods_id()
  438. # partner 无税率,入库单行商品有税率
  439. self.env.ref('core.lenovo').tax_rate = 0
  440. self.env.ref('goods.keyboard').tax_rate = 10
  441. order_line.with_context(
  442. {'default_partner': self.receipt.partner_id.id}).onchange_goods_id()
  443. # partner 税率 > 入库单行商品税率
  444. self.env.ref('core.lenovo').tax_rate = 11
  445. self.env.ref('goods.keyboard').tax_rate = 10
  446. order_line.with_context(
  447. {'default_partner': self.receipt.partner_id.id}).onchange_goods_id()
  448. # partner 税率 =< 入库单行商品税率
  449. self.env.ref('core.lenovo').tax_rate = 9
  450. self.env.ref('goods.keyboard').tax_rate = 10
  451. order_line.with_context(
  452. {'default_partner': self.receipt.partner_id.id}).onchange_goods_id()
上海开阖软件有限公司 沪ICP备12045867号-1