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.

283 satır
12KB

  1. from odoo.tests.common import TransactionCase
  2. from odoo.exceptions import UserError
  3. class TestSellAdjust(TransactionCase):
  4. @classmethod
  5. def setUpClass(cls):
  6. super().setUpClass()
  7. # Declare the business roles required by the original order workflow.
  8. cls.env.user.groups_id |= cls.env.ref('sell.group_sell')
  9. def setUp(self):
  10. '''销售变更单准备基本数据'''
  11. super(TestSellAdjust, self).setUp()
  12. self.env.ref('core.jd').credit_limit = 100000
  13. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  14. 'finance.account_goods').id
  15. self.env.ref('warehouse.wh_in_whin0').date = '2016-02-06'
  16. # 销售订单 10个 网线
  17. self.order = self.env.ref('sell.sell_order_2')
  18. self.order.sell_order_done()
  19. self.keyboard = self.env.ref('goods.keyboard')
  20. self.keyboard_white = self.env.ref('goods.keyboard_white')
  21. self.mouse = self.env.ref('goods.mouse')
  22. self.cable = self.env.ref('goods.cable')
  23. # 因为下面要用到 商品在系统里面必须是有数量的 所以,找到一个简单的方式直接确认已有的盘点单
  24. warehouse_obj = self.env.ref('warehouse.wh_in_whin0')
  25. warehouse_obj.warehouse_dest_id = self.order.warehouse_id
  26. warehouse_obj.approve_order()
  27. for l in self.env['wh.move.line'].search([]):
  28. l.read()
  29. def test_unlink(self):
  30. '''测试删除已审核的销售变更单'''
  31. adjust = self.env['sell.adjust'].create({
  32. 'order_id': self.order.id,
  33. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  34. 'quantity': 2,
  35. }),
  36. ]
  37. })
  38. adjust.sell_adjust_done()
  39. with self.assertRaises(UserError):
  40. adjust.unlink()
  41. # 删除草稿状态的销售变更单
  42. new = adjust.copy()
  43. new.unlink()
  44. def test_sell_adjust_done(self):
  45. '''审核销售变更单:正常情况'''
  46. # 正常情况下审核,新增商品鼠标(每批次为1的)、键盘(无批次的)
  47. adjust = self.env['sell.adjust'].create({
  48. 'order_id': self.order.id,
  49. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  50. 'quantity': 2,
  51. }),
  52. (0, 0, {'goods_id': self.mouse.id,
  53. 'quantity': 1,
  54. }),
  55. (0, 0, {'goods_id': self.keyboard.id,
  56. 'attribute_id': self.keyboard_white.id,
  57. 'quantity': 1,
  58. })
  59. ]
  60. })
  61. adjust.sell_adjust_done()
  62. # 重复审核时报错
  63. with self.assertRaises(UserError):
  64. adjust.sell_adjust_done()
  65. def test_sell_adjust_done_no_line(self):
  66. '''审核销售变更单:没输入明细行,审核时报错'''
  67. adjust = self.env['sell.adjust'].create({
  68. 'order_id': self.order.id,
  69. })
  70. with self.assertRaises(UserError):
  71. adjust.sell_adjust_done()
  72. def test_sell_adjust_done_all_in(self):
  73. '''审核销售变更单:销售订单生成的发货单已全部出库,审核时报错'''
  74. new_order = self.order.copy()
  75. new_order.sell_order_done()
  76. delivery = self.env['sell.delivery'].search(
  77. [('order_id', '=', new_order.id)])
  78. delivery.discount_amount = 0 # 订单行中价格为0,所以整单金额0
  79. delivery.sell_delivery_done()
  80. adjust = self.env['sell.adjust'].create({
  81. 'order_id': new_order.id,
  82. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  83. 'quantity': 1,
  84. }),
  85. ]
  86. })
  87. with self.assertRaises(UserError):
  88. adjust.sell_adjust_done()
  89. def test_sell_adjust_done_more_same_line(self):
  90. '''审核销售变更单:查找到销售订单中多行同一商品,不能调整'''
  91. new_order = self.order.copy()
  92. new_order.line_ids.create({'order_id': new_order.id,
  93. 'goods_id': self.cable.id,
  94. 'quantity': 10,
  95. 'price_taxed': 10.0,
  96. })
  97. new_order.sell_order_done()
  98. delivery = self.env['sell.delivery'].search(
  99. [('order_id', '=', new_order.id)])
  100. for line in delivery.line_out_ids:
  101. line.goods_qty = 1
  102. delivery.discount_amount = 0 # 订单行中价格为0,所以整单金额0
  103. delivery.sell_delivery_done()
  104. adjust = self.env['sell.adjust'].create({
  105. 'order_id': new_order.id,
  106. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  107. 'quantity': 3.0,
  108. }),
  109. ]
  110. })
  111. with self.assertRaises(UserError):
  112. adjust.sell_adjust_done()
  113. def test_sell_adjust_done_quantity_lt(self):
  114. '''审核销售变更单:调整后数量 5 < 原订单已出库数量 6,审核时报错'''
  115. delivery = self.env['sell.delivery'].search(
  116. [('order_id', '=', self.order.id)])
  117. for line in delivery.line_out_ids:
  118. line.goods_qty = 6
  119. delivery.sell_delivery_done()
  120. adjust = self.env['sell.adjust'].create({
  121. 'order_id': self.order.id,
  122. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  123. 'quantity': -5,
  124. })]
  125. })
  126. with self.assertRaises(UserError):
  127. adjust.sell_adjust_done()
  128. def test_sell_adjust_done_quantity_equal(self):
  129. '''审核销售变更单:调整后数量6 == 原订单已出库数量 6,审核后将产生的发货单分单删除'''
  130. delivery = self.env['sell.delivery'].search(
  131. [('order_id', '=', self.order.id)])
  132. for line in delivery.line_out_ids:
  133. line.goods_qty = 6
  134. delivery.sell_delivery_done()
  135. adjust = self.env['sell.adjust'].create({
  136. 'order_id': self.order.id,
  137. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  138. 'quantity': -4,
  139. })]
  140. })
  141. adjust.sell_adjust_done()
  142. new_delivery = self.env['sell.delivery'].search(
  143. [('order_id', '=', self.order.id),
  144. ('state', '=', 'draft')])
  145. self.assertTrue(not new_delivery)
  146. def test_sell_adjust_done_goods_done(self):
  147. '''审核销售变更单:原始单据中一行商品已全部出库,另一行没有'''
  148. new_order = self.order.copy()
  149. new_order.line_ids.create({'order_id': new_order.id,
  150. 'goods_id': self.keyboard.id,
  151. 'attribute_id': self.keyboard_white.id,
  152. 'quantity': 10,
  153. 'price_taxed': 10.0,
  154. })
  155. new_order.sell_order_done()
  156. delivery = self.env['sell.delivery'].search(
  157. [('order_id', '=', new_order.id)])
  158. for line in delivery.line_out_ids:
  159. if line.goods_id.id != self.keyboard.id:
  160. line.unlink()
  161. delivery.discount_amount = 0 # 订单行中价格为0,所以整单金额0
  162. delivery.sell_delivery_done()
  163. adjust = self.env['sell.adjust'].create({
  164. 'order_id': new_order.id,
  165. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  166. 'attribute_id': self.keyboard_white.id,
  167. 'quantity': 3.0,
  168. }),
  169. ]
  170. })
  171. with self.assertRaises(UserError):
  172. adjust.sell_adjust_done()
  173. def test_sell_adjust_done_no_attribute(self):
  174. '''检查属性是否填充'''
  175. adjust = self.env['sell.adjust'].create({
  176. 'order_id': self.order.id,
  177. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  178. 'quantity': 3.0,
  179. }),
  180. ]
  181. })
  182. with self.assertRaises(UserError):
  183. adjust.sell_adjust_done()
  184. class TestSellAdjustLine(TransactionCase):
  185. @classmethod
  186. def setUpClass(cls):
  187. super().setUpClass()
  188. # Declare the business roles required by the original order workflow.
  189. cls.env.user.groups_id |= cls.env.ref('sell.group_sell')
  190. def setUp(self):
  191. '''销售变更单明细基本数据'''
  192. super(TestSellAdjustLine, self).setUp()
  193. # 销售订单 10个 网线
  194. self.order = self.env.ref('sell.sell_order_2')
  195. self.order.sell_order_done()
  196. self.keyboard = self.env.ref('goods.keyboard')
  197. self.cable = self.env.ref('goods.cable')
  198. self.adjust = self.env['sell.adjust'].create({
  199. 'order_id': self.order.id,
  200. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  201. 'quantity': 1,
  202. })]
  203. })
  204. def test_compute_using_attribute(self):
  205. '''返回订单行中商品是否使用属性'''
  206. for line in self.adjust.line_ids:
  207. self.assertTrue(not line.using_attribute)
  208. line.goods_id = self.keyboard
  209. self.assertTrue(line.using_attribute)
  210. def test_compute_all_amount(self):
  211. '''当订单行的数量、单价、折扣额、税率改变时,改变销售金额、税额、价税合计'''
  212. for line in self.adjust.line_ids:
  213. line.price_taxed = 117
  214. self.assertTrue(line.amount == 100)
  215. self.assertTrue(line.tax_amount == 17)
  216. self.assertTrue(line.price_taxed == 117)
  217. self.assertTrue(line.subtotal == 117)
  218. def test_onchange_price(self):
  219. '''当订单行的不含税单价改变时,改变含税单价'''
  220. for line in self.adjust.line_ids:
  221. line.price_taxed = 0
  222. line.price = 10
  223. line.onchange_price()
  224. self.assertAlmostEqual(line.price_taxed, 11.7)
  225. def test_compute_all_amount_wrong_tax_rate(self):
  226. '''明细行上输入错误税率,应报错'''
  227. for line in self.adjust.line_ids:
  228. with self.assertRaises(UserError):
  229. line.tax_rate = -1
  230. with self.assertRaises(UserError):
  231. line.tax_rate = 102
  232. def test_onchange_goods_id(self):
  233. '''当销售订单行的商品变化时,带出商品上的单位、价格'''
  234. for line in self.adjust.line_ids:
  235. line.goods_id = self.keyboard
  236. line.onchange_goods_id()
  237. self.assertTrue(line.uom_id.name == '件')
  238. def test_onchange_discount_rate(self):
  239. ''' 订单行优惠率改变时,改变优惠金额'''
  240. for line in self.adjust.line_ids:
  241. line.price_taxed = 117
  242. line.discount_rate = 10
  243. line.onchange_discount_rate()
  244. def test_onchange_goods_id_tax_rate(self):
  245. """The adjustment applies the original customer's and goods' lower rate."""
  246. customer = self.env.ref('core.jd')
  247. self.adjust.order_id.partner_id = customer
  248. goods = self.env.ref('goods.cable')
  249. goods.goods_class_id = False
  250. self.env.company.output_tax_rate = 17
  251. for customer_rate, goods_rate, expected in [(0, 0, 17), (10, 0, 10),
  252. (0, 10, 10), (11, 10, 10), (9, 10, 9)]:
  253. customer.tax_rate = customer_rate
  254. goods.tax_rate = goods_rate
  255. for line in self.adjust.line_ids:
  256. line.onchange_goods_id()
  257. self.assertEqual(line.tax_rate, expected)
上海开阖软件有限公司 沪ICP备12045867号-1