GoodERP
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

433 lines
18KB

  1. from odoo.tests.common import TransactionCase
  2. from odoo.exceptions import UserError
  3. from datetime import datetime
  4. class TestSellOrder(TransactionCase):
  5. @classmethod
  6. def setUpClass(cls):
  7. super().setUpClass()
  8. # Declare the business roles required by the original order workflow.
  9. cls.env.user.groups_id |= cls.env.ref('sell.group_sell')
  10. def setUp(self):
  11. super(TestSellOrder, self).setUp()
  12. self.env.ref('core.jd').credit_limit = 100000
  13. self.order = self.env.ref('sell.sell_order_1')
  14. self.return_order = self.env.ref('sell.sell_order_return')
  15. self.env.ref('sell.sell_order_line_1').tax_rate = 0
  16. # 因同一个业务伙伴不能存在两张未审核的收付款单,把系统里已有的相关业务伙伴未审核的收付款单审核
  17. self.env.ref('money.get_40000').money_order_done()
  18. self.env.ref('money.pay_2000').money_order_done()
  19. self.partner_id = self.env.ref('core.jd')
  20. self.province_id = self.env['country.state'].search(
  21. [('name', '=', '河北省')])
  22. self.city_id = self.env['all.city'].search(
  23. [('city_name', '=', '石家庄市')])
  24. self.county_id = self.env['all.county'].search(
  25. [('county_name', '=', '正定县')])
  26. def test_compute_amount(self):
  27. ''' 计算字段的测试'''
  28. self.assertEqual(self.order.amount, 154048.00)
  29. def test_default_warehouse(self):
  30. '''新建销售订单时调出仓库的默认值'''
  31. order = self.env['sell.order'].with_context({
  32. 'warehouse_type': 'stock'
  33. }).create({})
  34. self.assertTrue(order.warehouse_id.type == 'stock')
  35. def test_onchange_partner_id(self):
  36. '''选择客户带出其默认地址信息'''
  37. self.order.onchange_partner_id()
  38. # partner 无 税率,销售单行商品无税率
  39. self.env.ref('core.jd').tax_rate = 0
  40. self.env.ref('goods.mouse').tax_rate = 0
  41. self.order.onchange_partner_id()
  42. # partner 有 税率,销售单行商品无税率
  43. self.env.ref('core.jd').tax_rate = 10
  44. self.env.ref('goods.mouse').tax_rate = 0
  45. self.order.onchange_partner_id()
  46. # partner 无税率,销售单行商品无税率
  47. self.env.ref('core.jd').tax_rate = 0
  48. self.env.ref('goods.mouse').tax_rate = 10
  49. self.order.onchange_partner_id()
  50. # partner 税率 > 销售单行商品税率
  51. self.env.ref('core.jd').tax_rate = 11
  52. self.env.ref('goods.mouse').tax_rate = 10
  53. self.order.onchange_partner_id()
  54. # partner 税率 =< 销售单行商品税率
  55. self.env.ref('core.jd').tax_rate = 9
  56. self.env.ref('goods.mouse').tax_rate = 10
  57. self.order.onchange_partner_id()
  58. # partner 不存在默认联系人
  59. self.partner_id.write({'child_ids':
  60. [(0, 0, {'contact': '小东',
  61. 'province_id': self.province_id.id,
  62. 'city_id': self.city_id.id,
  63. 'county_id': self.county_id.id,
  64. 'town': '曹路镇',
  65. 'detail_address': '金海路1688号',
  66. }
  67. )]})
  68. self.order.onchange_partner_id()
  69. # partner 存在默认联系人
  70. for child in self.partner_id.child_ids:
  71. child.mobile = '1385559999'
  72. child.phone = '55558888'
  73. child.qq = '11116666'
  74. child.is_default_add = True
  75. self.order.onchange_partner_id()
  76. def test_onchange_address(self):
  77. ''' sell.order onchange address '''
  78. address = self.env['partner.address'].create({'contact': '小东',
  79. 'province_id': self.province_id.id,
  80. 'city_id': self.city_id.id,
  81. 'county_id': self.county_id.id,
  82. 'town': '曹路镇',
  83. 'detail_address': '金海路1688号',
  84. })
  85. self.order.address_id = address.id
  86. self.order.onchange_partner_address()
  87. def test_onchange_discount_rate(self):
  88. ''' sell.order onchange test '''
  89. self.order.discount_rate = 10
  90. self.order.onchange_discount_rate()
  91. self.assertEqual(self.order.discount_amount, 15408.0)
  92. def test_unlink(self):
  93. '''测试删除已审核的销售订单'''
  94. self.env.ref('sell.sell_order_line_1').tax_rate = 0
  95. self.order.sell_order_done()
  96. with self.assertRaises(UserError):
  97. self.order.unlink()
  98. # 删除草稿状态的销售订单
  99. self.order.copy()
  100. self.order.sell_order_draft()
  101. self.order.unlink()
  102. def test_sell_order_done(self):
  103. '''测试审核销售订单'''
  104. # 审核销售订单
  105. self.order.sell_order_done()
  106. with self.assertRaises(UserError):
  107. self.order.sell_order_done()
  108. # 未填数量应报错
  109. self.order.sell_order_draft()
  110. for line in self.order.line_ids:
  111. line.quantity = 0
  112. with self.assertRaises(UserError):
  113. self.order.sell_order_done()
  114. # 输入预收款和结算账户
  115. bank_account = self.env.ref('core.alipay')
  116. bank_account.balance = 1000000
  117. self.order.pre_receipt = 50.0
  118. self.order.bank_account_id = bank_account
  119. for line in self.order.line_ids:
  120. line.quantity = 1
  121. self.order.sell_order_done()
  122. # 预收款不为空时,请选择结算账户!
  123. self.order.sell_order_draft()
  124. self.order.bank_account_id = False
  125. self.order.pre_receipt = 50.0
  126. with self.assertRaises(UserError):
  127. self.order.sell_order_done()
  128. def test_sell_order_done_no_line(self):
  129. '''没有订单行时审核报错'''
  130. for line in self.order.line_ids:
  131. line.unlink()
  132. with self.assertRaises(UserError):
  133. self.order.sell_order_done()
  134. def test_sell_order_done_foreign_currency(self):
  135. '''测试审核销售订单,外币免税'''
  136. self.order.currency_id = self.env.ref('base.USD')
  137. for line in self.order.line_ids:
  138. line.price_taxed = 1170
  139. line.tax_rate = 17
  140. with self.assertRaises(UserError):
  141. self.order.sell_order_done()
  142. def test_sell_order_draft(self):
  143. ''' 测试反审核销售订单 '''
  144. self.order.sell_order_done()
  145. self.order.sell_order_draft()
  146. with self.assertRaises(UserError):
  147. self.order.sell_order_draft()
  148. def test_action_view_delivery(self):
  149. """ 测试 查看发货/退货单 """
  150. warehouse_obj = self.env.ref('warehouse.wh_in_whin0')
  151. warehouse_obj.warehouse_dest_id = self.order.warehouse_id
  152. warehouse_obj.approve_order()
  153. self.order.sell_order_done()
  154. self.order.action_view_delivery()
  155. self.env.ref('core.jd').credit_limit = 0
  156. delivery = self.env['sell.delivery'].search(
  157. [('order_id', '=', self.order.id)])
  158. for line in delivery.line_out_ids:
  159. line.goods_qty = 1
  160. # Use the actual product+attribute and warehouse of this delivery.
  161. # The stock demo's white keyboard is not a black-keyboard lot.
  162. incoming = self.env['wh.in'].create({
  163. 'type': 'inventory', 'warehouse_id': self.env.ref('warehouse.warehouse_inventory').id,
  164. 'warehouse_dest_id': delivery.warehouse_id.id,
  165. 'line_in_ids': [(0, 0, {'goods_id': line.goods_id.id,
  166. 'attribute_id': line.attribute_id.id, 'uom_id': line.uom_id.id,
  167. 'goods_qty': 1, 'cost_unit': line.goods_id.cost,
  168. 'lot': 'DEV65-VIEW-%s' % line.id, 'type': 'in'})],
  169. })
  170. incoming.approve_order()
  171. if line.goods_id.using_batch:
  172. line.lot_id = incoming.line_in_ids
  173. delivery.sell_delivery_done()
  174. self.order.action_view_delivery()
  175. # 先入库
  176. order_2 = self.env.ref('sell.sell_order_2')
  177. order_2.warehouse_id = warehouse_obj.warehouse_dest_id
  178. order_2.sell_order_done()
  179. delivery_2 = self.env['sell.delivery'].search([('order_id', '=', order_2.id)])
  180. for line in delivery_2.line_out_ids:
  181. line.goods_qty = 8
  182. delivery_2.sell_delivery_done()
  183. # len(delivery_ids) > 1
  184. order_2.action_view_delivery()
  185. # compute_delivery_count
  186. #self.assertTrue(order_2.delivery_count == 2)
  187. def test_action_view_return(self):
  188. '''该销售订单对应的退货单'''
  189. self.return_order.sell_order_done()
  190. self.return_order.action_view_return()
  191. self.assertTrue(self.return_order.return_count == 1)
  192. # len(delivery_ids) > 1
  193. delivery = self.env['sell.delivery'].search([
  194. ('order_id', '=', self.return_order.id)])
  195. for line in delivery.line_in_ids:
  196. line.goods_qty = 5
  197. line.location_id = self.env.ref('warehouse.b001_location')
  198. '''
  199. delivery.sell_delivery_done()
  200. self.return_order.action_view_return()
  201. self.assertTrue(self.return_order.return_count == 2)
  202. '''
  203. def test_sell_order_done_no_attribute(self):
  204. '''检查属性是否填充'''
  205. self.order.line_ids[0].goods_id = self.env.ref('goods.keyboard')
  206. with self.assertRaises(UserError):
  207. self.order.sell_order_done()
  208. def test_compute_net_weight(self):
  209. '''计算净重合计'''
  210. self.env.ref('goods.mouse').net_weight = 50
  211. self.order.line_ids[0].quantity = 10
  212. self.assertEqual(self.order.net_weight, 50 * 10)
  213. class TestSellOrderLine(TransactionCase):
  214. def setUp(self):
  215. super(TestSellOrderLine, self).setUp()
  216. self.order = self.env.ref('sell.sell_order_1')
  217. self.sell_order_line = self.env.ref('sell.sell_order_line_2_3')
  218. def test_compute_using_attribute(self):
  219. '''返回订单行中商品是否使用属性'''
  220. for line in self.order.line_ids:
  221. self.assertTrue(not line.using_attribute)
  222. line.goods_id = self.env.ref('goods.keyboard')
  223. self.assertTrue(line.using_attribute)
  224. def test_compute_all_amount(self):
  225. ''' 销售订单行计算字段的测试 '''
  226. self.assertEqual(self.sell_order_line.amount,
  227. 107) # tax_amount subtotal
  228. self.sell_order_line.onchange_goods_id()
  229. self.assertEqual(self.sell_order_line.tax_rate, 17.0)
  230. self.sell_order_line.price_taxed = 11.7
  231. self.sell_order_line.tax_rate = 17
  232. self.sell_order_line._compute_all_amount()
  233. self.assertEqual(self.sell_order_line.tax_amount, 15.55)
  234. self.assertEqual(self.sell_order_line.subtotal, 107)
  235. def test_compute_all_amount_foreign_currency(self):
  236. # '''外币测试:当订单行的数量、含税单价、折扣额、税率改变时,改变销售金额、税额、价税合计'''
  237. # 本位币
  238. self.order.currency_id = self.env.ref('base.CNY')
  239. for line in self.order.line_ids:
  240. line.price_taxed = 11.7
  241. self.order.currency_id = self.env.ref('base.EUR')
  242. for line in self.order.line_ids:
  243. line.price_taxed = 11.7
  244. def test_compute_all_amount_wrong_tax_rate(self):
  245. '''明细行上输入错误税率,应报错'''
  246. for line in self.order.line_ids:
  247. with self.assertRaises(UserError):
  248. line.tax_rate = -1
  249. with self.assertRaises(UserError):
  250. line.tax_rate = 102
  251. def test_onchange_price(self):
  252. '''当订单行的不含税单价改变时,改变含税单价'''
  253. for line in self.order.line_ids:
  254. line.price_taxed = 0
  255. line.price = 10
  256. line.onchange_price()
  257. self.assertAlmostEqual(line.price_taxed, 11.7)
  258. def test_onchange_goods_id(self):
  259. '''当销售订单行的商品变化时,带出商品上的单位、价格'''
  260. goods = self.env.ref('goods.keyboard')
  261. c_category_id = self.order.partner_id.c_category_id
  262. for line in self.order.line_ids:
  263. line.goods_id = goods
  264. line.onchange_goods_id()
  265. self.assertTrue(line.uom_id.name == '件')
  266. # 测试价格是否是商品的销售价
  267. self.assertTrue(line.price == goods.price)
  268. def test_onchange_goods_id_tax_rate(self):
  269. ''' 测试 修改商品时,商品行税率变化 '''
  270. self.order_line = self.env.ref('sell.sell_order_line_1')
  271. # partner 无 税率,销售单行商品无税率
  272. self.env.ref('core.jd').tax_rate = 0
  273. self.env.ref('goods.mouse').tax_rate = 0
  274. self.order_line.onchange_goods_id()
  275. # partner 有 税率,销售单行商品无税率
  276. self.env.ref('core.jd').tax_rate = 10
  277. self.env.ref('goods.mouse').tax_rate = 0
  278. self.order_line.onchange_goods_id()
  279. # partner 无税率,销售单行商品有税率
  280. self.env.ref('core.jd').tax_rate = 0
  281. self.env.ref('goods.mouse').tax_rate = 10
  282. self.order_line.onchange_goods_id()
  283. # partner 税率 > 销售单行商品税率
  284. self.env.ref('core.jd').tax_rate = 11
  285. self.env.ref('goods.mouse').tax_rate = 10
  286. self.order_line.onchange_goods_id()
  287. # partner 税率 =< 销售单行商品税率
  288. self.env.ref('core.jd').tax_rate = 9
  289. self.env.ref('goods.mouse').tax_rate = 10
  290. self.order_line.onchange_goods_id()
  291. def test_onchange_warehouse_id(self):
  292. '''仓库和商品带出价格策略的折扣率'''
  293. order_line = self.env.ref('sell.sell_order_line_1')
  294. order_line.onchange_warehouse_id()
  295. order = self.env.ref('sell.sell_order_1')
  296. order.partner_id = self.env.ref('core.yixun').id
  297. order_line.onchange_warehouse_id()
  298. # 找不到价格策略时
  299. order.date = '1999-01-01'
  300. order_line.onchange_warehouse_id()
  301. def test_onchange_discount_rate(self):
  302. ''' 销售订单行 折扣率 on_change'''
  303. self.sell_order_line.discount_rate = 20
  304. self.sell_order_line.onchange_discount_rate()
  305. self.assertEqual(round(self.sell_order_line.amount,1), 93.6)
  306. class TestApproveMultiSellOrder(TransactionCase):
  307. @classmethod
  308. def setUpClass(cls):
  309. super().setUpClass()
  310. # Declare the business roles required by the original order workflow.
  311. cls.env.user.groups_id |= cls.env.ref('sell.group_sell')
  312. def setUp(self):
  313. ''' setUp Data '''
  314. super(TestApproveMultiSellOrder, self).setUp()
  315. self.env.ref('core.jd').credit_limit = 100000
  316. self.order = self.env.ref('sell.sell_order_1')
  317. self.order_2 = self.env.ref('sell.sell_order_2')
  318. self.partner_id = self.env.ref('core.jd')
  319. # 因同一个业务伙伴不能存在两张未审核的收付款单,把系统里已有的相关业务伙伴未审核的收付款单审核
  320. self.env.ref('money.get_40000').money_order_done()
  321. self.env.ref('money.pay_2000').money_order_done()
  322. def test_default_get_rejects_confirmed_order(self):
  323. '''Opening the batch wizard rejects confirmed orders, including after view caching.'''
  324. sell_obj = self.env['approve.multi.sell.order']
  325. # Loading the view does not cache order-dependent business validation.
  326. self.assertIn('arch', sell_obj.get_view(view_type='form'))
  327. # 不报错的情况
  328. sell_obj.with_context({
  329. 'active_model': 'sell.order',
  330. 'active_ids': [self.order.id, self.order_2.id]
  331. }).default_get(['note'])
  332. # 报错:存在销售订单已审核的单据
  333. self.order_2.sell_order_done()
  334. with self.assertRaises(UserError):
  335. sell_obj.with_context({
  336. 'active_model': 'sell.order',
  337. 'active_ids': [self.order.id, self.order_2.id]
  338. }).default_get(['note'])
  339. def test_approve_sell_order(self):
  340. ''' Test: approve_sell_order '''
  341. sell_obj = self.env['approve.multi.sell.order']
  342. # 批量审核销售订单
  343. sell_obj.with_context({
  344. 'active_ids': [self.order.id, self.order_2.id]
  345. }).approve_sell_order()
  346. def test_set_default_note(self):
  347. ''' Test: set_default_note '''
  348. sell_obj = self.env['approve.multi.sell.order']
  349. # 设置默认值
  350. sell_obj.set_default_note()
  351. class TestOrderRoleBoundary(TransactionCase):
  352. def test_order_actions_require_business_group(self):
  353. from odoo.tests.common import new_test_user
  354. user = new_test_user(self.env, login='native_sell_no_role', groups='base.group_user')
  355. self.assertFalse(user.has_group('sell.group_sell'))
  356. order = self.env.ref('sell.sell_order_1')
  357. before = order.state
  358. for action in ('sell_order_done', 'sell_order_draft'):
  359. with self.subTest(action=action), self.assertRaisesRegex(UserError, '只有'):
  360. getattr(order.with_user(user), action)()
  361. self.assertEqual(order.state, before)
  362. class TestBatchWizardAPI(TransactionCase):
  363. def test_opening_rechecks_state_after_cached_view(self):
  364. category = self.env['core.category'].create({'name': 'DEV65兼容客户类', 'type': 'customer'})
  365. partner = self.env['partner'].create({'name': 'DEV65批量确认兼容客户',
  366. 'c_category_id': category.id})
  367. warehouse = self.env['warehouse'].create({'name': 'DEV65兼容销售仓', 'type': 'stock'})
  368. order = self.env['sell.order'].create({'partner_id': partner.id, 'warehouse_id': warehouse.id})
  369. wizard = self.env['approve.multi.sell.order'].with_context(
  370. active_model='sell.order', active_ids=order.ids)
  371. self.assertIn('arch', wizard.get_view(view_type='form'))
  372. self.assertIn(order.name, wizard.default_get(['note'])['note'])
  373. order.state = 'done'
  374. with self.assertRaisesRegex(UserError, '已确认'):
  375. wizard.default_get(['note'])
  376. order.state = 'draft'
  377. self.assertIn(order.name, wizard.default_get(['note'])['note'])
上海开阖软件有限公司 沪ICP备12045867号-1