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.

417 lignes
17KB

  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 TestBuyOrder(TransactionCase):
  6. def setUp(self):
  7. super(TestBuyOrder, self).setUp()
  8. # 给buy_order_1中的商品“键盘”的分类设置科目
  9. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  10. 'finance.account_goods').id
  11. self.order = self.env.ref('buy.buy_order_1')
  12. self.order.bank_account_id = False
  13. # 因同一个业务伙伴不能存在两张未审核的收付款单,把系统里已有的相关业务伙伴未审核的收付款单审核
  14. self.env.ref('money.get_40000').money_order_done()
  15. self.env.ref('money.pay_2000').money_order_done()
  16. def test_get_paid_amount(self):
  17. ''' 测试:计算采购订单付款/退款 '''
  18. self.order.buy_order_done()
  19. receipt = self.env['buy.receipt'].search([('order_id', '=', self.order.id)])
  20. receipt.payment = 1
  21. receipt.bank_account_id = self.env.ref('core.comm').id
  22. receipt.buy_receipt_done()
  23. money = self.env['money.order'].search([('buy_id', '=', self.order.id)])
  24. money.money_order_done()
  25. self.assertTrue(self.order.paid_amount == 1)
  26. def test_get_paid_amount_pay_divided(self):
  27. ''' 测试:分批付款时,采购订单付款/退款 '''
  28. self.order.invoice_by_receipt = False
  29. plan = self.env['payment.plan'].create({
  30. 'buy_id': self.order.id,
  31. 'name': 'first',
  32. 'amount_money': 10,
  33. })
  34. plan.request_payment()
  35. # 生成的发票未核销,已付金额为0
  36. self.assertTrue(self.order.paid_amount == 0)
  37. def test_onchange_discount_rate(self):
  38. ''' 优惠率改变时,改变优惠金额,成交金额也改变'''
  39. amount_before = self.order.amount
  40. discount_amount_before = self.order.discount_amount
  41. self.order.discount_rate = 10
  42. self.order.onchange_discount_rate()
  43. if amount_before:
  44. self.assertTrue(self.order.amount != amount_before)
  45. self.assertTrue(self.order.discount_amount !=
  46. discount_amount_before)
  47. def test_get_buy_goods_state(self):
  48. '''返回收货状态'''
  49. # order商品总数量为10
  50. self.order.buy_order_done()
  51. # 采购订单行的已入库数量为0时,将商品状态写为未入库
  52. self.assertTrue(self.order.goods_state == '未入库')
  53. receipt = self.env['buy.receipt'].search(
  54. [('order_id', '=', self.order.id)])
  55. # 采购订单行的已入库数量等于商品数量时,将商品状态写为全部入库
  56. receipt.buy_receipt_done()
  57. self.assertTrue(self.order.goods_state == '全部入库')
  58. def test_get_buy_goods_state_part_in(self):
  59. '''返回收货状态:部分入库'''
  60. # 采购订单行的已入库数量小于商品数量时,将商品状态写为部分入库
  61. self.order.buy_order_done()
  62. receipt = self.env['buy.receipt'].search(
  63. [('order_id', '=', self.order.id)])
  64. for line in receipt.line_in_ids:
  65. line.goods_qty = 5
  66. receipt.buy_receipt_done()
  67. self.assertTrue(self.order.goods_state == '部分入库')
  68. back_rec = self.env['buy.receipt'].search(
  69. [('order_id', '=', self.order.id), ('state', '=', 'draft')])
  70. back_rec.action_cancel()
  71. self.assertTrue(self.order.goods_state == '部分入库剩余作废')
  72. def test_default_warehouse_dest(self):
  73. '''新建采购订单时默认调入仓库'''
  74. order = self.env['buy.order'].with_context({
  75. 'warehouse_dest_type': 'stock'
  76. }).create({})
  77. self.assertTrue(order.warehouse_dest_id.type == 'stock')
  78. def test_unlink(self):
  79. '''测试删除已审核的采购订单'''
  80. self.order.buy_order_done()
  81. with self.assertRaises(UserError):
  82. self.order.unlink()
  83. # 删除草稿状态的采购订单
  84. self.order.buy_order_draft()
  85. self.order.unlink()
  86. def test_buy_order_done(self):
  87. '''采购订单审核'''
  88. # 正常审核
  89. self.order.buy_order_done()
  90. self.assertTrue(self.order.state == 'done')
  91. # 重复审核报错
  92. with self.assertRaises(UserError):
  93. self.order.buy_order_done()
  94. # 数量单价小于0应报错
  95. self.order.buy_order_draft()
  96. for line in self.order.line_ids:
  97. line.quantity = 0
  98. with self.assertRaises(UserError):
  99. self.order.buy_order_done()
  100. # 输入预付款和结算账户
  101. bank_account = self.env.ref('core.alipay')
  102. bank_account.balance = 1000000
  103. self.order.prepayment = 50.0
  104. self.order.bank_account_id = bank_account
  105. for line in self.order.line_ids:
  106. line.quantity = 1
  107. line.tax_rate = 0
  108. self.order.buy_order_done()
  109. # 预付款不为空时,请选择结算账户
  110. self.order.buy_order_draft()
  111. self.order.bank_account_id = False
  112. self.order.prepayment = 50.0
  113. with self.assertRaises(UserError):
  114. self.order.buy_order_done()
  115. # 没有订单行时审核报错
  116. for line in self.order.line_ids:
  117. line.unlink()
  118. with self.assertRaises(UserError):
  119. self.order.buy_order_done()
  120. def test_buy_order_done_foreign_currency(self):
  121. """测试审核采购订单,外币免税"""
  122. self.order.currency_id = self.env.ref('base.USD')
  123. for line in self.order.line_ids:
  124. line.price_taxed = 1170
  125. line.tax_rate = 17
  126. with self.assertRaises(UserError):
  127. self.order.buy_order_done()
  128. def test_buy_order_draft(self):
  129. '''采购订单反审核'''
  130. # 正常反审核
  131. self.order.buy_order_done()
  132. self.order.buy_order_draft()
  133. receipt = self.env['buy.receipt'].search(
  134. [('order_id', '=', self.order.id)])
  135. self.assertTrue(not receipt)
  136. self.assertTrue(self.order.state == 'draft')
  137. self.assertTrue(not self.order.approve_uid.id)
  138. # 重复反审核报错
  139. self.order.buy_order_done()
  140. self.order.buy_order_draft()
  141. with self.assertRaises(UserError):
  142. self.order.buy_order_draft()
  143. # 订单已收货不能反审核
  144. self.order.buy_order_done()
  145. receipt = self.env['buy.receipt'].search(
  146. [('order_id', '=', self.order.id)])
  147. receipt.buy_receipt_done()
  148. with self.assertRaises(UserError):
  149. self.order.buy_order_draft()
  150. def test_buy_order_draft_with_prepayment(self):
  151. '''有预付款的采购订单反审核'''
  152. # 输入预付款和结算账户
  153. bank_account = self.env.ref('core.alipay')
  154. bank_account.balance = 1000000
  155. self.order.prepayment = 100
  156. self.order.bank_account_id = bank_account
  157. self.order.buy_order_done()
  158. money_order = self.env['money.order'].search([
  159. ('origin_name', '=', self.order.name)])
  160. money_order.money_order_done()
  161. with self.assertRaises(UserError):
  162. self.order.buy_order_draft()
  163. def test_buy_generate_receipt(self):
  164. '''测试采购订单生成入库单,批次管理拆分折扣金额'''
  165. # 采购订单
  166. # 全部入库
  167. self.order.buy_order_done()
  168. receipt = self.env['buy.receipt'].search(
  169. [('order_id', '=', self.order.id)])
  170. receipt.buy_receipt_done()
  171. self.assertTrue(self.order.goods_state == '全部入库')
  172. # 批次管理拆分订单行
  173. new_order = self.order.copy()
  174. for line in new_order.line_ids:
  175. line.goods_id = self.env.ref('goods.mouse').id
  176. new_order.buy_generate_receipt()
  177. receipt = self.env['buy.receipt'].search(
  178. [('order_id', '=', new_order.id)])
  179. self.assertTrue(len(receipt.line_in_ids) == 10)
  180. # 退货订单
  181. # 全部入库
  182. return_receipt = self.env.ref('buy.buy_return_order_1')
  183. return_receipt.buy_order_done()
  184. receipt = self.env['buy.receipt'].search(
  185. [('order_id', '=', return_receipt.id)])
  186. receipt.buy_receipt_done()
  187. return_receipt.buy_generate_receipt()
  188. def test_onchange_partner_id(self):
  189. # partner 无 税率,采购单行商品无税率
  190. self.env.ref('core.lenovo').tax_rate = 0
  191. self.env.ref('goods.keyboard').tax_rate = 0
  192. self.order.onchange_partner_id()
  193. # partner 有 税率,采购单行商品无税率
  194. self.env.ref('core.lenovo').tax_rate = 10
  195. self.env.ref('goods.keyboard').tax_rate = 0
  196. self.order.onchange_partner_id()
  197. # partner 无税率,采购单行商品无税率
  198. self.env.ref('core.lenovo').tax_rate = 0
  199. self.env.ref('goods.keyboard').tax_rate = 10
  200. self.order.onchange_partner_id()
  201. # partner 税率 > 采购单行商品税率
  202. self.env.ref('core.lenovo').tax_rate = 11
  203. self.env.ref('goods.keyboard').tax_rate = 10
  204. self.order.onchange_partner_id()
  205. # partner 税率 =< 采购单行商品税率
  206. self.env.ref('core.lenovo').tax_rate = 11
  207. self.env.ref('goods.keyboard').tax_rate = 12
  208. self.order.onchange_partner_id()
  209. def test_compute_receipt_and_invoice(self):
  210. '''计算生成入库单和结算单的个数'''
  211. self.order.buy_order_done()
  212. self.assertTrue(self.order.receipt_count == 1)
  213. self.order.receipt_ids[0].buy_receipt_done()
  214. self.assertTrue(self.order.invoice_count == 1)
  215. self.assertTrue(self.order.invoice_ids ==
  216. self.order.receipt_ids[0].invoice_id)
  217. def test_action_view_receipt(self):
  218. '''查看生成的入库单'''
  219. # 生成一张入库单
  220. self.order.buy_order_done()
  221. self.order.action_view_receipt()
  222. # 生成两张入库单
  223. self.order.buy_order_draft()
  224. self.order.buy_order_done()
  225. for line in self.order.receipt_ids[0].line_in_ids:
  226. line.goods_qty = 3
  227. self.order.receipt_ids[0].buy_receipt_done()
  228. self.order.action_view_receipt()
  229. def test_action_view_return(self):
  230. '''查看生成的采购退货单'''
  231. self.order.type = 'return'
  232. self.env.ref('buy.buy_order_line_1').goods_id = self.env.ref('goods.cable').id
  233. self.env.ref('buy.buy_order_line_1').attribute_id = False
  234. self.env.ref('warehouse.wh_in_whin0').warehouse_dest_id = self.env.ref('warehouse.sh_stock').id
  235. self.env.ref('warehouse.wh_in_whin0').approve_order()
  236. # 生成一张采购退货单
  237. self.order.buy_order_done()
  238. self.order.action_view_return()
  239. # 生成两张采购退货单
  240. self.order.buy_order_draft()
  241. self.order.buy_order_done()
  242. for line in self.order.receipt_ids[0].line_out_ids:
  243. line.goods_qty = 3
  244. self.order.receipt_ids[0].buy_receipt_done()
  245. self.order.action_view_return()
  246. def test_action_view_invoice(self):
  247. '''查看生成的结算单'''
  248. # 生成一张入库单,审核后查看结算单
  249. self.order.buy_order_done()
  250. self.order.action_view_invoice()
  251. self.order.receipt_ids[0].buy_receipt_done()
  252. self.order.action_view_invoice()
  253. # 生成两张入库单,都审核后在采购订单上查看结算单
  254. self.order.receipt_ids[0].buy_receipt_draft()
  255. self.order.buy_order_draft()
  256. self.order.buy_order_done()
  257. for line in self.order.receipt_ids[0].line_in_ids:
  258. line.goods_qty = 3
  259. self.order.receipt_ids[0].buy_receipt_done()
  260. self.order.action_view_invoice()
  261. def test_action_view_receipt(self):
  262. """ 测试 查看发货/退货单 """
  263. self.order.buy_order_done()
  264. self.order.action_view_receipt()
  265. receipt = self.env['buy.receipt'].search(
  266. [('order_id', '=', self.order.id)])
  267. for line in receipt.line_in_ids:
  268. line.goods_qty = 1
  269. receipt.buy_receipt_done()
  270. self.order.action_view_receipt()
  271. def test_buy_order_done_no_attribute(self):
  272. '''检查属性是否填充'''
  273. self.order.line_ids[0].attribute_id = False
  274. with self.assertRaises(UserError):
  275. self.order.buy_order_done()
  276. class TestBuyOrderLine(TransactionCase):
  277. def setUp(self):
  278. super(TestBuyOrderLine, self).setUp()
  279. self.order = self.env.ref('buy.buy_order_1')
  280. self.cable = self.env.ref('goods.cable')
  281. def test_compute_using_attribute(self):
  282. '''返回订单行中商品是否使用属性'''
  283. for line in self.order.line_ids:
  284. self.assertTrue(line.using_attribute)
  285. line.goods_id = self.env.ref('goods.mouse')
  286. self.assertTrue(not line.using_attribute)
  287. def test_compute_all_amount(self):
  288. '''当订单行的数量、含税单价、折扣额、税率改变时,改变采购金额、税额、价税合计'''
  289. for line in self.order.line_ids:
  290. line.price_taxed = 11.7
  291. self.assertTrue(line.amount == 100)
  292. self.assertTrue(line.tax_amount == 17)
  293. self.assertAlmostEqual(line.price_taxed, 11.7)
  294. self.assertTrue(line.subtotal == 117)
  295. def test_compute_all_amount_foreign_currency(self):
  296. '''外币测试:当订单行的数量、含税单价、折扣额、税率改变时,改变采购金额、税额、价税合计'''
  297. # 单据上外币是公司本位币
  298. self.order.currency_id = self.env.ref('base.CNY')
  299. for line in self.order.line_ids:
  300. line.price_taxed = 11.7
  301. # 外币
  302. self.order.currency_id = self.env.ref('base.EUR')
  303. for line in self.order.line_ids:
  304. line.price_taxed = 11.7
  305. def test_compute_all_amount_wrong_tax_rate(self):
  306. '''明细行上输入错误税率,应报错'''
  307. for line in self.order.line_ids:
  308. with self.assertRaises(UserError):
  309. line.tax_rate = -1
  310. with self.assertRaises(UserError):
  311. line.tax_rate = 102
  312. def test_onchange_price(self):
  313. '''当订单行的不含税单价改变时,改变含税单价'''
  314. for line in self.order.line_ids:
  315. line.price_taxed = 0
  316. line.price = 10
  317. line.onchange_price()
  318. self.assertAlmostEqual(line.price_taxed, 11.7)
  319. def test_onchange_goods_id(self):
  320. '''当订单行的商品变化时,带出商品上的单位、成本'''
  321. for line in self.order.line_ids:
  322. line.goods_id = self.cable
  323. line.onchange_goods_id()
  324. self.assertTrue(line.uom_id.name == '件')
  325. # 测试价格是否是商品的成本
  326. self.assertTrue(line.price == self.cable.cost)
  327. def test_onchange_goods_id_tax_rate(self):
  328. ''' 测试 修改商品时,采购单行税率变化 '''
  329. self.order_line = self.env.ref('buy.buy_order_line_1')
  330. # partner 无 税率,采购单行商品无税率
  331. self.env.ref('core.lenovo').tax_rate = 0
  332. self.env.ref('goods.keyboard').tax_rate = 0
  333. self.order_line.onchange_goods_id()
  334. # partner 有 税率,采购单行商品无税率
  335. self.env.ref('core.lenovo').tax_rate = 10
  336. self.env.ref('goods.keyboard').tax_rate = 0
  337. self.order_line.onchange_goods_id()
  338. # partner 无税率,采购单行商品有税率
  339. self.env.ref('core.lenovo').tax_rate = 0
  340. self.env.ref('goods.keyboard').tax_rate = 10
  341. self.order_line.onchange_goods_id()
  342. # partner 税率 > 采购单行商品税率
  343. self.env.ref('core.lenovo').tax_rate = 11
  344. self.env.ref('goods.keyboard').tax_rate = 10
  345. self.order_line.onchange_goods_id()
  346. # partner 税率 =< 采购单行商品税率
  347. self.env.ref('core.lenovo').tax_rate = 9
  348. self.env.ref('goods.keyboard').tax_rate = 10
  349. self.order_line.onchange_goods_id()
  350. def test_onchange_goods_id_vendor(self):
  351. '''当订单行的商品变化时,带出商品上供应商价'''
  352. # 添加网线的供应商价
  353. self.cable.vendor_ids.create({
  354. 'goods_id': self.cable.id,
  355. 'vendor_id': self.env.ref('core.lenovo').id,
  356. 'price': 2, })
  357. # 不选择供应商时,应弹出警告
  358. self.order.partner_id = False
  359. for line in self.order.line_ids:
  360. with self.assertRaises(UserError):
  361. line.onchange_goods_id()
  362. # 选择供应商联想,得到供应商价
  363. self.order.partner_id = self.env.ref('core.lenovo')
  364. for line in self.order.line_ids:
  365. line.goods_id = self.cable
  366. line.onchange_goods_id()
  367. self.assertTrue(line.price == 2)
  368. def test_onchange_discount_rate(self):
  369. ''' 订单行优惠率改变时,改变优惠金额'''
  370. for line in self.order.line_ids:
  371. line.price_taxed = 11.7
  372. line.discount_rate = 10
  373. line.onchange_discount_rate()
  374. self.assertTrue(line.discount_amount == 10)
上海开阖软件有限公司 沪ICP备12045867号-1