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.

689 lines
31KB

  1. from odoo.tests.common import TransactionCase
  2. from odoo.exceptions import UserError
  3. from datetime import datetime
  4. ISODATEFORMAT = '%Y-%m-%d'
  5. class TestSellDelivery(TransactionCase):
  6. def setUp(self):
  7. '''准备基本数据'''
  8. super(TestSellDelivery, self).setUp()
  9. self.env.ref('core.jd').credit_limit = 100000
  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_whin0').date = '2016-02-06'
  13. # 因同一个业务伙伴不能存在两张未审核的收付款单,把系统里已有的相关业务伙伴未审核的收付款单审核
  14. self.env.ref('money.get_40000').money_order_done()
  15. self.env.ref('money.pay_2000').money_order_done()
  16. self.bank_account = self.env.ref('core.alipay')
  17. self.bank_account.balance = 10000
  18. self.order = self.env.ref('sell.sell_order_2')
  19. self.order.bank_account_id = self.bank_account.id
  20. self.order.pre_receipt = 1
  21. self.order.sell_order_done()
  22. self.delivery = self.env['sell.delivery'].search(
  23. [('order_id', '=', self.order.id)])
  24. self.return_order = self.env.ref('sell.sell_order_return')
  25. self.return_order.sell_order_done()
  26. self.return_delivery = self.env['sell.delivery'].search(
  27. [('order_id', '=', self.return_order.id)])
  28. for line in self.return_delivery.line_in_ids:
  29. line.location_id = self.env.ref('warehouse.b001_location').id
  30. self.warehouse_obj = self.env.ref('warehouse.wh_in_whin0')
  31. self.warehouse_obj.warehouse_dest_id = self.order.warehouse_id
  32. self.warehouse_obj.approve_order()
  33. for l in self.env['wh.move.line'].search([]):
  34. l.read()
  35. self.warehouse_id = self.env.ref('warehouse.bj_stock')
  36. self.customer_warehouse_id = self.env.ref(
  37. 'warehouse.warehouse_customer')
  38. self.goods = self.env.ref('goods.cable')
  39. self.partner = self.env.ref('core.lenovo')
  40. self.province_id = self.env['country.state'].search(
  41. [('name', '=', '河北省')])
  42. self.city_id = self.env['all.city'].search(
  43. [('city_name', '=', '石家庄市')])
  44. self.county_id = self.env['all.county'].search(
  45. [('county_name', '=', '正定县')])
  46. def test_sell_to_return(self):
  47. self.delivery.sell_delivery_done()
  48. self.delivery.sell_to_return()
  49. # 销售发货单存在草稿状态的退货单!
  50. with self.assertRaises(UserError):
  51. self.delivery.sell_to_return()
  52. # 部分退货
  53. return_order = self.env['sell.delivery'].search([
  54. ('is_return', '=', True),
  55. ('origin_id', '=', self.delivery.id),
  56. ('state', '=', 'draft')
  57. ])
  58. for line_in in return_order.line_in_ids:
  59. line_in.goods_qty = 4
  60. return_order.sell_delivery_done()
  61. # 二次退货
  62. self.delivery.sell_to_return()
  63. return_order_2 = self.env['sell.delivery'].search([
  64. ('is_return', '=', True),
  65. ('origin_id', '=', self.delivery.id),
  66. ('state', '=', 'draft')
  67. ])
  68. for line_in in return_order_2.line_in_ids:
  69. line_in.goods_qty = 4
  70. return_order_2.sell_delivery_done()
  71. # 三次退货,执行 if return_goods.get(t_key)
  72. self.delivery.sell_to_return()
  73. def test_sell_to_return_all_return(self):
  74. ''' Test raise error: all is return '''
  75. self.delivery.sell_delivery_done()
  76. self.delivery.sell_to_return()
  77. return_order = self.env['sell.delivery'].search([
  78. ('is_return', '=', True),
  79. ('origin_id', '=', self.delivery.id),
  80. ('state', '=', 'draft')
  81. ])
  82. return_order.sell_delivery_done()
  83. with self.assertRaises(UserError):
  84. self.delivery.sell_to_return()
  85. def test_sell_to_return_goods_is_using_batch(self):
  86. '''转化为销售退货单goods using_batch'''
  87. vals = {'partner_id': self.partner.id,
  88. 'date_due': (datetime.now()).strftime(ISODATEFORMAT),
  89. 'warehouse_id': self.warehouse_id.id,
  90. 'warehouse_dest_id': self.customer_warehouse_id.id,
  91. 'line_out_ids': [(0, 0, {'goods_id': self.env.ref('goods.mouse').id,
  92. 'lot_id': self.env.ref('warehouse.wh_move_line_12').id,
  93. 'price_taxed': 400,
  94. 'goods_qty': 1,
  95. 'type': 'out'})],
  96. }
  97. new = self.env['sell.delivery'].create(vals)
  98. new.sell_delivery_done()
  99. new.sell_to_return()
  100. def test_get_sell_goods_state(self):
  101. '''返回发货状态'''
  102. self.assertEqual(self.order.goods_state, '未出库')
  103. for d in self.order.delivery_ids:
  104. d.sell_delivery_done()
  105. self.assertEqual(self.order.goods_state, '全部出库')
  106. def test_get_sell_goods_cancel_state(self):
  107. '''测试部分取消'''
  108. for d in self.order.delivery_ids:
  109. for l in d.line_out_ids:
  110. # 订单10件,部分发货
  111. l.goods_qty = 4
  112. d.sell_delivery_done()
  113. self.assertEqual(self.order.goods_state, '部分出库')
  114. for d in self.order.delivery_ids:
  115. if d.state == 'draft':
  116. d.action_cancel()
  117. self.assertEqual(self.order.goods_state, '部分出库剩余作废')
  118. def test_onchange_partner_id(self):
  119. '''选择客户带出其默认地址信息'''
  120. # partner 不存在默认联系人
  121. partner = self.env.ref('core.jd')
  122. partner.write({'child_ids':
  123. [(0, 0, {'contact': '小东',
  124. 'province_id': self.province_id.id,
  125. 'city_id': self.city_id.id,
  126. 'county_id': self.county_id.id,
  127. 'town': '曹路镇',
  128. 'detail_address': '金海路1688号',
  129. }
  130. )]})
  131. self.delivery.onchange_partner_id()
  132. # partner 存在默认联系人
  133. for child in partner.child_ids:
  134. child.mobile = '1385559999'
  135. child.phone = '55558888'
  136. child.qq = '11116666'
  137. child.is_default_add = True
  138. self.delivery.onchange_partner_id()
  139. def test_onchange_address(self):
  140. ''' sell.delivery onchange address '''
  141. address = self.env['partner.address'].create({'contact': '小东',
  142. 'province_id': self.province_id.id,
  143. 'city_id': self.city_id.id,
  144. 'county_id': self.county_id.id,
  145. 'town': '曹路镇',
  146. 'detail_address': '金海路1688号',
  147. })
  148. self.delivery.address_id = address.id
  149. self.delivery.onchange_address_id()
  150. def test_onchange_discount_rate(self):
  151. """ 发货单中折扣率 on_change"""
  152. self.delivery.discount_rate = 10
  153. self.delivery.write(
  154. {"date_due": (datetime.now()).strftime(ISODATEFORMAT)})
  155. self.delivery.onchange_discount_rate()
  156. self.assertAlmostEqual(self.delivery.discount_amount, 10.70)
  157. def test_onchange_discount_rate_in(self):
  158. """ 销售 退货单 的折扣率 on_change 测试"""
  159. self.return_delivery.discount_rate = 10
  160. self.return_delivery.onchange_discount_rate()
  161. self.assertAlmostEqual(self.return_delivery.discount_amount, 10.70)
  162. def test_get_sell_money_state(self):
  163. '''测试返回收款状态'''
  164. # 未收款
  165. self.delivery.sell_delivery_done()
  166. self.delivery.sell_to_return()
  167. self.delivery._get_sell_money_state()
  168. self.assertEqual(self.delivery.money_state, '未收款')
  169. # 部分收款
  170. delivery = self.delivery.copy()
  171. delivery.receipt = delivery.amount - 1
  172. delivery.bank_account_id = self.bank_account
  173. delivery.sell_delivery_done()
  174. # 判断状态
  175. delivery._get_sell_money_state()
  176. self.assertEqual(delivery.money_state, '部分收款')
  177. # 全部收款
  178. delivery = self.delivery.copy()
  179. delivery.receipt = delivery.amount
  180. delivery.bank_account_id = self.bank_account
  181. delivery.sell_delivery_done()
  182. # 判断状态
  183. delivery._get_sell_money_state()
  184. self.assertEqual(delivery.money_state, '全部收款')
  185. def test_get_sell_money_state_return(self):
  186. '''测试返回退款状态'''
  187. # 未退款
  188. self.return_delivery.sell_delivery_done()
  189. self.return_delivery._get_sell_money_state()
  190. self.assertEqual(self.return_delivery.return_state, '未退款')
  191. # 部分退款
  192. return_delivery = self.return_delivery.copy()
  193. return_delivery.receipt = return_delivery.amount - 1
  194. return_delivery.bank_account_id = self.bank_account
  195. return_delivery.sell_delivery_done()
  196. # 判断状态
  197. return_delivery._get_sell_money_state()
  198. self.assertEqual(return_delivery.return_state, '部分退款')
  199. # 全部退款
  200. return_delivery = self.return_delivery.copy()
  201. return_delivery.receipt = return_delivery.amount
  202. return_delivery.bank_account_id = self.bank_account
  203. return_delivery.sell_delivery_done()
  204. # 判断状态
  205. return_delivery._get_sell_money_state()
  206. self.assertEqual(return_delivery.return_state, '全部退款')
  207. def test_unlink(self):
  208. '''测试删除销售发货/退货单'''
  209. # 测试是否可以删除已审核的单据
  210. self.delivery.sell_delivery_done()
  211. with self.assertRaises(UserError):
  212. self.delivery.unlink()
  213. # 删除销售发货单时,测试能否删除发货单行
  214. delivery = self.delivery.copy()
  215. move_id = delivery.sell_move_id.id
  216. delivery.unlink()
  217. move = self.env['wh.move'].search(
  218. [('id', '=', move_id)])
  219. self.assertTrue(not move)
  220. self.assertTrue(not move.line_out_ids)
  221. def test_sell_delievery_done_no_account_id(self):
  222. """销售 发货单 审核时付款账户为空 测试"""
  223. self.delivery.bank_account_id = False
  224. self.delivery.receipt = 20
  225. with self.assertRaises(UserError):
  226. self.delivery.sell_delivery_done()
  227. def test_sell_delievery_done_receipt_greater_than_amount(self):
  228. ''' 发货单 本次收款金额 大于总金额 '''
  229. self.delivery.receipt = 100000
  230. self.delivery.amount = 10
  231. self.delivery.bank_account_id = self.bank_account.id
  232. with self.assertRaises(UserError):
  233. self.delivery.sell_delivery_done()
  234. def test_sell_delivery_done_wrong(self):
  235. '''审核发货单/退货单报错情况'''
  236. # 销售发货单重复审核
  237. delivery = self.delivery
  238. delivery.sell_delivery_done()
  239. with self.assertRaises(UserError):
  240. delivery.sell_delivery_done()
  241. # 发货单审核时未填数量应报错
  242. for line in self.delivery.line_out_ids:
  243. line.goods_qty = 0
  244. with self.assertRaises(UserError):
  245. self.delivery.sell_delivery_done()
  246. # 销售退货单审核时未填数量应报错
  247. for line in self.return_delivery.line_in_ids:
  248. line.goods_qty = 0
  249. with self.assertRaises(UserError):
  250. self.return_delivery.sell_delivery_done()
  251. def test_auto_reconcile_sell_order(self):
  252. ''' 预收款与结算单自动核销 '''
  253. delivery = self.delivery
  254. delivery.receipt = 74
  255. delivery.bank_account_id = self.bank_account
  256. delivery.sell_delivery_done()
  257. def test_sell_delivery_done(self):
  258. """审核退货单正常流程"""
  259. vals = {'partner_id': self.partner.id,
  260. 'is_return': True,
  261. 'date_due': (datetime.now()).strftime(ISODATEFORMAT),
  262. 'warehouse_id': self.customer_warehouse_id.id,
  263. 'warehouse_dest_id': self.warehouse_id.id,
  264. 'line_in_ids': [(0, 0, {'goods_id': self.goods.id,
  265. 'price_taxed': 100, 'goods_qty': 5})],
  266. 'cost_line_ids': [(0, 0, {'partner_id': self.partner.id,
  267. 'category_id': self.env.ref('core.cat_freight').id,
  268. 'amount': 50})]}
  269. return_delivery = self.env['sell.delivery'].create(vals)
  270. return_delivery.sell_delivery_done()
  271. def test_sell_delivery_done_goods_inventory(self):
  272. '''发库单审核时商品不足直接盘盈'''
  273. for line in self.delivery.line_out_ids:
  274. line.goods_id = self.env.ref('goods.computer')
  275. self.delivery.sell_delivery_done()
  276. def test_goods_inventory(self):
  277. '''发库单审核商品不足时调用创建盘盈入库方法'''
  278. for line in self.delivery.line_out_ids:
  279. vals = {
  280. 'type': 'inventory',
  281. 'warehouse_id': self.env.ref('warehouse.warehouse_inventory').id,
  282. 'warehouse_dest_id': self.delivery.warehouse_id.id,
  283. 'line_in_ids': [(0, 0, {
  284. 'goods_id': line.goods_id.id,
  285. 'attribute_id': line.attribute_id.id,
  286. 'uos_id': line.uos_id.id,
  287. 'goods_qty': line.goods_qty,
  288. 'uom_id': line.uom_id.id,
  289. 'cost_unit': line.goods_id.cost
  290. }
  291. )]
  292. }
  293. self.delivery.goods_inventory(vals)
  294. # no message
  295. self.delivery.open_dialog('goods_inventory', vals)
  296. def test_sell_delivery_done_not_create_voucher(self):
  297. '''发库单审核商品不足时不生成凭证'''
  298. # 一个网线缺货
  299. self.warehouse_obj.cancel_approved_order()
  300. order_1 = self.env.ref('sell.sell_order_1')
  301. order_1.warehouse_id = self.env.ref('warehouse.sh_stock')
  302. for line in order_1.line_ids:
  303. line.goods_id = self.env.ref('goods.cable')
  304. line.quantity = 1
  305. line.discount_amount = 0
  306. order_1.sell_order_done()
  307. delivery = self.env['sell.delivery'].search(
  308. [('order_id', '=', order_1.id)])
  309. line = delivery.line_out_ids[0]
  310. vals = {
  311. 'type': 'inventory',
  312. 'warehouse_id': self.env.ref('warehouse.warehouse_inventory').id,
  313. 'warehouse_dest_id': delivery.warehouse_id.id,
  314. 'line_in_ids': [(0, 0, {
  315. 'goods_id': line.goods_id.id,
  316. 'uos_id': line.uos_id.id,
  317. 'goods_qty': 1,
  318. 'uom_id': line.uom_id.id,
  319. })]
  320. }
  321. delivery.goods_inventory(vals)
  322. self.assertEqual(line.cost, 0.0)
  323. self.assertTrue(not delivery.voucher_id)
  324. def test_create_zero_wh_in_with_attribute(self):
  325. '''创建一个缺货向导:有属性的商品'''
  326. for line in self.delivery.line_out_ids:
  327. line.goods_id = self.env.ref('goods.keyboard')
  328. line.attribute_id = self.env.ref('goods.keyboard_white')
  329. line.goods_qty = 610
  330. self.delivery.sell_delivery_done()
  331. # 商品的数量和含税单价不能小于0
  332. vals = {'partner_id': self.partner.id,
  333. 'date_due': (datetime.now()).strftime(ISODATEFORMAT),
  334. 'warehouse_id': self.warehouse_id.id,
  335. 'warehouse_dest_id': self.customer_warehouse_id.id,
  336. 'line_out_ids': [(0, 0, {'goods_id': self.env.ref('goods.iphone').id,
  337. 'attribute_id': self.env.ref('goods.iphone_white').id,
  338. 'price_taxed': 100,
  339. 'goods_qty': 0,
  340. 'type': 'out'})],
  341. }
  342. new = self.env['sell.delivery'].create(vals)
  343. with self.assertRaises(UserError):
  344. new.sell_delivery_done()
  345. # #客户有自己的发货时检查信用额度的逻辑,这里暂时去掉gooderp原生的检查
  346. # def test_sell_delivery_done_raise_credit_limit(self):
  347. # '''审核发货单/退货单 客户的 本次发货金额+客户应收余额 不能大于客户信用额度'''
  348. # self.delivery.amount = 20000000
  349. # with self.assertRaises(UserError):
  350. # self.delivery.sell_delivery_done()
  351. def test_sell_delivery_done_return_goods_and_money(self):
  352. '''如果已退货也已退款不生成新的分单'''
  353. self.delivery.sell_to_return()
  354. ret_order = self.env['sell.delivery'].search([('origin_id', '=', self.delivery.id)])
  355. ret_order.bank_account_id = self.bank_account.id
  356. ret_order.receipt = ret_order.amount
  357. ret_order.sell_delivery_done()
  358. self.assertEqual(ret_order.order_id.delivery_count, 1)
  359. def test_sell_delivery_draft(self):
  360. '''反审核发货单/退货单'''
  361. # 先审核发货单,再反审核
  362. for line in self.delivery.line_out_ids:
  363. line.goods_qty = 8
  364. self.delivery.sell_delivery_done()
  365. self.delivery.sell_delivery_draft()
  366. # 修改发货单,再次审核,并不产生分单
  367. for line in self.delivery.line_out_ids:
  368. line.goods_qty = 5
  369. self.delivery.sell_delivery_done()
  370. delivery = self.env['sell.delivery'].search(
  371. [('order_id', '=', self.order.id)])
  372. self.assertTrue(len(delivery) == 2)
  373. def test_sell_delivery_draft_money_order_process(self):
  374. ''' sell delivery draft: handle money order in case of different situation'''
  375. # 先审核发货单,再反审核
  376. self.delivery.bank_account_id = self.bank_account.id
  377. self.delivery.receipt = 5
  378. for line in self.delivery.line_out_ids:
  379. line.goods_qty = 8
  380. self.delivery.sell_delivery_done()
  381. deliverys = self.env['sell.delivery'].search(
  382. [('order_id', '=', self.order.id)])
  383. for delivery in deliverys:
  384. if delivery.state != 'done':
  385. for line in delivery.line_out_ids:
  386. line.goods_id.excess = True
  387. line.goods_qty = 8
  388. delivery.sell_delivery_done()
  389. # 建发货单对应的收款单
  390. money_order = self.env['money.order'].with_context({'type': 'get'}).create({
  391. 'partner_id': self.env.ref('core.jd').id,
  392. 'line_ids': [(0, 0, {
  393. 'bank_id': self.env.ref('core.comm').id,
  394. 'amount': 30000.0})]
  395. })
  396. money_order.onchange_partner_id()
  397. # 反审核销售发货单
  398. with self.assertRaises(UserError):
  399. deliverys and deliverys[0].sell_delivery_draft()
  400. def test_sell_delivery_draft_raise_error(self):
  401. '''不能反审核已核销的发货单'''
  402. self.env.company.draft_invoice = False
  403. self.delivery.sell_delivery_done()
  404. order = self.env['reconcile.order'].create({
  405. 'partner_id': self.env.ref('core.jd').id,
  406. 'business_type': 'adv_pay_to_get',
  407. })
  408. order.onchange_partner_id()
  409. # 将预收款40000的收款单核销本次发货单(金额75)
  410. for line in order.advance_payment_ids:
  411. if line.name != self.env.ref('money.get_40000'):
  412. line.unlink()
  413. else:
  414. line.this_reconcile = 75.0
  415. order.reconcile_order_done()
  416. with self.assertRaises(UserError):
  417. self.delivery.sell_delivery_draft()
  418. def test_sell_delivery_draft_quantity_out(self):
  419. '''反审核时,回写销售订单行已执行数量'''
  420. # 退货类型的销售订单生成的退货单的反审核
  421. self.return_delivery.sell_delivery_done()
  422. self.return_delivery.sell_delivery_draft()
  423. self.assertEqual(self.return_delivery.line_in_ids[0].sell_line_id.quantity_out, 0.0)
  424. # 销售类型的销售订单生成的发货单,生成退货单的反审核
  425. return_dict = self.delivery.sell_to_return()
  426. return_order = self.env['sell.delivery'].search(
  427. [('id', '=', return_dict['res_id'])])
  428. return_order.line_in_ids[0].goods_qty = 30
  429. return_order.sell_delivery_done()
  430. return_order.sell_delivery_draft()
  431. self.assertEqual(return_order.line_in_ids[0].sell_line_id.quantity_out, 0.0)
  432. def test_no_stock(self):
  433. ''' 测试虚拟商品出库 '''
  434. delivery = self.delivery.copy()
  435. for line in delivery.line_out_ids:
  436. line.goods_id = self.env.ref('goods.diy')
  437. delivery.sell_delivery_done()
  438. def test_scan_barcode(self):
  439. '''销售扫码出入库'''
  440. warehouse = self.env['wh.move']
  441. barcode = '12345678987'
  442. # 销售退货扫码
  443. model_name = 'sell.delivery'
  444. warehouse.scan_barcode(model_name, barcode, self.return_delivery.id)
  445. warehouse.scan_barcode(model_name, barcode, self.return_delivery.id)
  446. # 销售出库单扫码
  447. sell_order = self.env.ref('sell.sell_order_1')
  448. self.env.ref('sell.sell_order_line_1').tax_rate = 0
  449. sell_order.sell_order_done()
  450. delivery_order = self.env['sell.delivery'].search(
  451. [('order_id', '=', sell_order.id)])
  452. warehouse.scan_barcode(model_name, barcode, delivery_order.id)
  453. warehouse.scan_barcode(model_name, barcode, delivery_order.id)
  454. # 商品的条形码扫码出入库
  455. barcode = '123456789'
  456. # 销售出库单扫码
  457. warehouse.scan_barcode(model_name, barcode, delivery_order.id)
  458. warehouse.scan_barcode(model_name, barcode, delivery_order.id)
  459. # 销售退货扫码
  460. warehouse.scan_barcode(model_name, barcode, self.return_delivery.id)
  461. warehouse.scan_barcode(model_name, barcode, self.return_delivery.id)
  462. def test_onchange_partner_id_tax_rate(self):
  463. ''' 测试 改变 partner, 出库单行商品税率变化 '''
  464. delivery = self.env['sell.delivery'].search(
  465. [('order_id', '=', self.order.id)])
  466. # partner 无 税率, 出库单行商品无税率
  467. self.env.ref('core.jd').tax_rate = 0
  468. self.env.ref('goods.cable').tax_rate = 0
  469. delivery.onchange_partner_id()
  470. # partner 有 税率, 出库单行商品无税率
  471. self.env.ref('core.jd').tax_rate = 10
  472. self.env.ref('goods.cable').tax_rate = 0
  473. delivery.onchange_partner_id()
  474. # partner 无税率, 出库单行商品无税率
  475. self.env.ref('core.jd').tax_rate = 0
  476. self.env.ref('goods.cable').tax_rate = 10
  477. delivery.onchange_partner_id()
  478. # partner 税率 > 出库单行商品税率
  479. self.env.ref('core.jd').tax_rate = 11
  480. self.env.ref('goods.cable').tax_rate = 10
  481. delivery.onchange_partner_id()
  482. # partner 税率 =< 出库单行商品税率
  483. self.env.ref('core.jd').tax_rate = 11
  484. self.env.ref('goods.cable').tax_rate = 12
  485. delivery.onchange_partner_id()
  486. def test_sell_delivery_done_currency(self):
  487. """发货单上是外币时进行审核"""
  488. self.delivery.currency_id = self.env.ref('base.USD')
  489. self.delivery.sell_delivery_done()
  490. def test_sell_delivery_draft_twice(self):
  491. '''重复撤销报错'''
  492. with self.assertRaises(UserError):
  493. self.delivery.sell_delivery_draft()
  494. class TestWhMoveLine(TransactionCase):
  495. def setUp(self):
  496. '''准备基本数据'''
  497. super(TestWhMoveLine, self).setUp()
  498. self.env.ref('core.jd').credit_limit = 100000
  499. self.sell_return = self.browse_ref('sell.sell_order_return')
  500. self.sell_return.sell_order_done()
  501. self.delivery_return = self.env['sell.delivery'].search(
  502. [('order_id', '=', self.sell_return.id)])
  503. self.sell_order = self.env.ref('sell.sell_order_1')
  504. self.env.ref('sell.sell_order_line_1').tax_rate = 0
  505. self.sell_order.sell_order_done()
  506. self.delivery = self.env['sell.delivery'].search(
  507. [('order_id', '=', self.sell_order.id)])
  508. self.goods_cable = self.browse_ref('goods.cable')
  509. self.goods_keyboard = self.browse_ref('goods.keyboard')
  510. self.warehouse_id = self.env.ref('warehouse.hd_stock')
  511. self.customer_warehouse_id = self.env.ref(
  512. 'warehouse.warehouse_customer')
  513. self.partner = self.env.ref('core.jd')
  514. vals = {'partner_id': self.partner.id,
  515. 'is_return': False,
  516. 'date_due': (datetime.now()).strftime(ISODATEFORMAT),
  517. 'warehouse_id': self.customer_warehouse_id.id,
  518. 'warehouse_dest_id': self.warehouse_id.id,
  519. 'line_out_ids': [(0, 0, {'goods_id': self.goods_cable.id,
  520. 'goods_qty': 5,
  521. 'tax_rate': 17.0,
  522. 'type': 'out'})],
  523. }
  524. self.new_delivery = self.env['sell.delivery'].create(vals)
  525. def test_onchange_warehouse_id(self):
  526. '''wh.move.line仓库和商品带出价格策略的折扣率'''
  527. for line in self.delivery.line_out_ids[0]:
  528. line.with_context({'default_date': '2016-04-01',
  529. 'warehouse_type': 'customer',
  530. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  531. self.assertTrue(line.discount_rate == 10)
  532. line.with_context({'default_date': '2016-05-01',
  533. 'warehouse_type': 'customer',
  534. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  535. self.assertTrue(line.discount_rate == 20)
  536. line.with_context({'default_date': '2016-06-01',
  537. 'warehouse_type': 'customer',
  538. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  539. self.assertTrue(line.discount_rate == 30)
  540. line.with_context({'default_date': '2016-07-01',
  541. 'warehouse_type': 'customer',
  542. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  543. self.assertTrue(line.discount_rate == 40)
  544. line.with_context({'default_date': '2016-08-01',
  545. 'warehouse_type': 'customer',
  546. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  547. self.assertTrue(line.discount_rate == 50)
  548. line.with_context({'default_date': '2016-09-01',
  549. 'warehouse_type': 'customer',
  550. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  551. self.assertTrue(line.discount_rate == 60)
  552. line.with_context({'default_date': '2016-10-01',
  553. 'warehouse_type': 'customer',
  554. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  555. self.assertTrue(line.discount_rate == 70)
  556. line.with_context({'default_date': '2016-11-01',
  557. 'warehouse_type': 'customer',
  558. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  559. self.assertTrue(line.discount_rate == 80)
  560. line.with_context({'default_date': '2016-12-01',
  561. 'warehouse_type': 'customer',
  562. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  563. self.assertTrue(line.discount_rate == 90)
  564. line.with_context({'default_date': '3000-02-01',
  565. 'warehouse_type': 'customer',
  566. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  567. self.assertTrue(line.discount_rate == 0)
  568. line.with_context({'default_date': '2017-01-01',
  569. 'warehouse_type': 'customer',
  570. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  571. self.assertTrue(line.discount_rate == 0)
  572. # 仓库类型不为客户仓时
  573. line.with_context({'default_date': '2017-01-01',
  574. 'default_partner': self.delivery.partner_id.id}).onchange_warehouse_id()
  575. self.assertTrue(line.discount_rate == 0)
  576. def test_onchange_goods_id(self):
  577. '''测试销售模块中商品的onchange,是否会带出单价'''
  578. # 销售退货单
  579. for line in self.delivery_return.line_in_ids:
  580. line.with_context({'default_is_return': True,
  581. 'default_partner': self.delivery_return.partner_id.id}).onchange_goods_id()
  582. def test_onchange_goods_id_tax_rate(self):
  583. ''' 测试 修改商品时,出库单行税率变化 '''
  584. for order_line in self.delivery.line_out_ids:
  585. # partner 无 税率,出库单行商品无税率
  586. self.partner.tax_rate = 0
  587. self.env.ref('goods.mouse').tax_rate = 0
  588. order_line.with_context(
  589. {'default_partner': self.delivery.partner_id.id}).onchange_goods_id()
  590. # partner 有 税率,出库单行商品无税率
  591. self.partner.tax_rate = 10
  592. self.env.ref('goods.mouse').tax_rate = 0
  593. order_line.with_context(
  594. {'default_partner': self.delivery.partner_id.id}).onchange_goods_id()
  595. # partner 无税率,出库单行商品有税率
  596. self.partner.tax_rate = 0
  597. self.env.ref('goods.mouse').tax_rate = 10
  598. order_line.with_context(
  599. {'default_partner': self.delivery.partner_id.id}).onchange_goods_id()
  600. # partner 税率 > 出库单行商品税率
  601. self.partner.tax_rate = 11
  602. self.env.ref('goods.mouse').tax_rate = 10
  603. order_line.with_context(
  604. {'default_partner': self.delivery.partner_id.id}).onchange_goods_id()
  605. # partner 税率 =< 出库单行商品税率
  606. self.partner.tax_rate = 9
  607. self.env.ref('goods.mouse').tax_rate = 10
  608. order_line.with_context(
  609. {'default_partner': self.delivery.partner_id.id}).onchange_goods_id()
  610. break
  611. def test_onchange_price(self):
  612. '''当订单行的不含税单价改变时,改变含税单价'''
  613. for line in self.new_delivery.line_out_ids:
  614. line.price = 10
  615. line.onchange_price()
  616. self.assertAlmostEqual(line.price_taxed, 11.7)
上海开阖软件有限公司 沪ICP备12045867号-1