GoodERP
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

731 lines
33KB

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