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

515 lines
22KB

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