GoodERP
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

310 Zeilen
13KB

  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 TestBuyAdjust(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('buy.group_buy')
  11. def setUp(self):
  12. '''采购变更单准备基本数据'''
  13. super(TestBuyAdjust, self).setUp()
  14. self.order = self.env.ref('buy.buy_order_1')
  15. for line in self.order.line_ids:
  16. line.tax_rate = 0
  17. self.order.buy_order_done()
  18. self.keyboard = self.env.ref('goods.keyboard')
  19. self.keyboard_black = self.env.ref('goods.keyboard_black')
  20. self.mouse = self.env.ref('goods.mouse')
  21. self.cable = self.env.ref('goods.cable')
  22. def test_unlink(self):
  23. '''测试删除已审核的采购变更单'''
  24. adjust = self.env['buy.adjust'].create({
  25. 'order_id': self.order.id,
  26. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  27. 'attribute_id': self.keyboard_black.id,
  28. 'quantity': 3.0,
  29. }),
  30. ]
  31. })
  32. adjust.buy_adjust_done()
  33. with self.assertRaises(UserError):
  34. adjust.unlink()
  35. # 删除草稿状态的采购变更单
  36. new = adjust.copy()
  37. new.unlink()
  38. def test_buy_adjust_done(self):
  39. '''审核采购变更单:正常情况'''
  40. # 正常情况下审核,新增商品鼠标(每批次为1的)、网线(无批次的)
  41. adjust = self.env['buy.adjust'].create({
  42. 'order_id': self.order.id,
  43. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  44. 'attribute_id': self.keyboard_black.id,
  45. 'quantity': 3.0,
  46. }),
  47. (0, 0, {'goods_id': self.mouse.id,
  48. 'quantity': 1,
  49. }),
  50. (0, 0, {'goods_id': self.cable.id,
  51. 'quantity': 1,
  52. })
  53. ]
  54. })
  55. adjust.buy_adjust_done()
  56. # 重复审核时报错
  57. with self.assertRaises(UserError):
  58. adjust.buy_adjust_done()
  59. def test_buy_adjust_done_no_line(self):
  60. '''审核采购变更单:没输入明细行,审核时报错'''
  61. adjust_no_line = self.env['buy.adjust'].create({
  62. 'order_id': self.order.id,
  63. })
  64. with self.assertRaises(UserError):
  65. adjust_no_line.buy_adjust_done()
  66. def test_buy_adjust_done_price_negative(self):
  67. '''审核采购变更单:商品价格为负,审核时报错'''
  68. adjust = self.env['buy.adjust'].create({
  69. 'order_id': self.order.id,
  70. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  71. 'attribute_id': self.keyboard_black.id,
  72. 'quantity': 3,
  73. 'price_taxed': -1,
  74. })]
  75. })
  76. with self.assertRaises(UserError):
  77. adjust.buy_adjust_done()
  78. def test_buy_adjust_done_quantity_lt(self):
  79. '''审核采购变更单:调整后数量 5 < 原订单已入库数量 6,审核时报错'''
  80. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  81. 'finance.account_goods').id
  82. buy_receipt = self.env['buy.receipt'].search(
  83. [('order_id', '=', self.order.id)])
  84. for line in buy_receipt.line_in_ids:
  85. line.goods_qty = 6
  86. buy_receipt.buy_receipt_done()
  87. adjust = self.env['buy.adjust'].create({
  88. 'order_id': self.order.id,
  89. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  90. 'attribute_id': self.keyboard_black.id,
  91. 'quantity': -5,
  92. })]
  93. })
  94. with self.assertRaises(UserError):
  95. adjust.buy_adjust_done()
  96. def test_buy_adjust_done_quantity_equal(self):
  97. '''审核采购变更单:调整后数量6 == 原订单已入库数量 6,审核后将产生的入库单分单删除'''
  98. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  99. 'finance.account_goods').id
  100. buy_receipt = self.env['buy.receipt'].search(
  101. [('order_id', '=', self.order.id)])
  102. for line in buy_receipt.line_in_ids:
  103. line.goods_qty = 6
  104. buy_receipt.buy_receipt_done()
  105. adjust = self.env['buy.adjust'].create({
  106. 'order_id': self.order.id,
  107. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  108. 'attribute_id': self.keyboard_black.id,
  109. 'quantity': -4,
  110. })]
  111. })
  112. '''
  113. adjust.buy_adjust_done()
  114. new_receipt = self.env['buy.receipt'].search(
  115. [('order_id', '=', self.order.id),
  116. ('state', '=', 'draft')])
  117. self.assertTrue(not new_receipt)
  118. '''
  119. def test_buy_adjust_done_all_in(self):
  120. '''审核采购变更单:采购订单生成的采购入库单已全部入库,审核时报错'''
  121. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  122. 'finance.account_goods').id
  123. receipt = self.env['buy.receipt'].search(
  124. [('order_id', '=', self.order.id)])
  125. receipt.buy_receipt_done()
  126. adjust = self.env['buy.adjust'].create({
  127. 'order_id': self.order.id,
  128. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  129. 'attribute_id': self.keyboard_black.id,
  130. 'quantity': 3.0,
  131. }),
  132. ]
  133. })
  134. with self.assertRaises(UserError):
  135. adjust.buy_adjust_done()
  136. def test_buy_adjust_done_more_same_line(self):
  137. '''审核采购变更单:查找到采购订单中多行同一商品,不能调整'''
  138. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  139. 'finance.account_goods').id
  140. self.order.buy_order_draft()
  141. self.order.line_ids.create({'order_id': self.order.id,
  142. 'goods_id': self.keyboard.id,
  143. 'attribute_id': self.keyboard_black.id,
  144. 'quantity': 10,
  145. 'price_taxed': 10.0,
  146. 'tax_rate': 0, })
  147. self.order.buy_order_done()
  148. receipt = self.env['buy.receipt'].search(
  149. [('order_id', '=', self.order.id)])
  150. for line in receipt.line_in_ids:
  151. line.goods_qty = 1
  152. receipt.buy_receipt_done()
  153. adjust = self.env['buy.adjust'].create({
  154. 'order_id': self.order.id,
  155. 'line_ids': [(0, 0, {'goods_id': self.keyboard.id,
  156. 'attribute_id': self.keyboard_black.id,
  157. 'quantity': 3.0,
  158. }),
  159. ]
  160. })
  161. with self.assertRaises(UserError):
  162. adjust.buy_adjust_done()
  163. def test_buy_adjust_done_goods_done(self):
  164. '''审核采购变更单:原始单据中一行商品已全部入库,另一行没有'''
  165. self.env.ref('core.goods_category_1').account_id = self.env.ref(
  166. 'finance.account_goods').id
  167. self.order.buy_order_draft()
  168. self.order.line_ids.create({'order_id': self.order.id,
  169. 'goods_id': self.cable.id,
  170. 'price_taxed': 10.0,
  171. 'quantity': 10,
  172. 'tax_rate': 0})
  173. self.order.buy_order_done()
  174. receipt = self.env['buy.receipt'].search(
  175. [('order_id', '=', self.order.id)])
  176. for line in receipt.line_in_ids:
  177. if line.goods_id.id != self.cable.id:
  178. line.unlink()
  179. receipt.buy_receipt_done()
  180. adjust = self.env['buy.adjust'].create({
  181. 'order_id': self.order.id,
  182. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  183. 'quantity': 3.0,
  184. }),
  185. ]
  186. })
  187. with self.assertRaises(UserError):
  188. adjust.buy_adjust_done()
  189. def test_buy_adjust_done_no_attribute(self):
  190. '''检查属性是否填充'''
  191. adjust = self.env['buy.adjust'].create({
  192. 'order_id': self.order.id,
  193. 'line_ids': [(0, 0, {'goods_id': self.env.ref('goods.keyboard').id,
  194. 'quantity': 10,
  195. })]
  196. })
  197. with self.assertRaises(UserError):
  198. adjust.buy_adjust_done()
  199. class TestBuyAdjustLine(TransactionCase):
  200. @classmethod
  201. def setUpClass(cls):
  202. super().setUpClass()
  203. # Declare the business roles required by the original order workflow.
  204. cls.env.user.groups_id |= cls.env.ref('buy.group_buy')
  205. def setUp(self):
  206. super(TestBuyAdjustLine, self).setUp()
  207. # 采购 10个键盘 单价 50
  208. self.order = self.env.ref('buy.buy_order_1')
  209. self.order.buy_order_done()
  210. self.keyboard = self.env.ref('goods.keyboard')
  211. self.cable = self.env.ref('goods.cable')
  212. self.adjust = self.env['buy.adjust'].create({
  213. 'order_id': self.order.id,
  214. 'line_ids': [(0, 0, {'goods_id': self.cable.id,
  215. 'quantity': 10,
  216. })]
  217. })
  218. def test_compute_using_attribute(self):
  219. '''返回订单行中商品是否使用属性'''
  220. for line in self.adjust.line_ids:
  221. self.assertTrue(not line.using_attribute)
  222. line.goods_id = self.keyboard
  223. self.assertTrue(line.using_attribute)
  224. def test_compute_all_amount(self):
  225. '''当订单行的数量、单价、折扣额、税率改变时,改变采购金额、税额、价税合计'''
  226. for line in self.adjust.line_ids:
  227. line.price_taxed = 11.7
  228. self.assertTrue(line.amount == 100)
  229. self.assertTrue(line.tax_amount == 17)
  230. self.assertTrue(line.subtotal == 117)
  231. def test_compute_all_amount_wrong_tax_rate(self):
  232. '''明细行上输入错误税率,应报错'''
  233. for line in self.adjust.line_ids:
  234. with self.assertRaises(UserError):
  235. line.tax_rate = -1
  236. with self.assertRaises(UserError):
  237. line.tax_rate = 102
  238. def test_onchange_price(self):
  239. '''当订单行的不含税单价改变时,改变含税单价'''
  240. for line in self.adjust.line_ids:
  241. line.price_taxed = 0
  242. line.price = 10
  243. line.onchange_price()
  244. self.assertAlmostEqual(line.price_taxed, 11.7)
  245. def test_onchange_goods_id(self):
  246. '''当订单行的商品变化时,带出商品上的单位、成本'''
  247. for line in self.adjust.line_ids:
  248. line.goods_id = self.cable
  249. line.onchange_goods_id()
  250. self.assertTrue(line.uom_id.name == '件')
  251. # 测试价格是否是商品的成本
  252. self.assertTrue(line.price_taxed == self.cable.cost)
  253. def test_onchange_discount_rate(self):
  254. ''' 订单行优惠率改变时,改变优惠金额'''
  255. for line in self.adjust.line_ids:
  256. line.price_taxed = 11.7
  257. line.discount_rate = 10
  258. line.onchange_discount_rate()
  259. self.assertTrue(line.discount_amount == 10)
  260. def test_onchange_goods_id_tax_rate(self):
  261. ''' 测试 修改商品时,商品行税率变化 '''
  262. for order_line in self.adjust.line_ids:
  263. # partner 无 税率,采购调整单行商品无税率
  264. self.env.ref('core.lenovo').tax_rate = 0
  265. self.env.ref('goods.cable').tax_rate = 0
  266. order_line.onchange_goods_id()
  267. # partner 有 税率,采购调整单行商品无税率
  268. self.env.ref('core.lenovo').tax_rate = 10
  269. self.env.ref('goods.cable').tax_rate = 0
  270. order_line.onchange_goods_id()
  271. # partner 无税率,采购调整单行商品有税率
  272. self.env.ref('core.lenovo').tax_rate = 0
  273. self.env.ref('goods.cable').tax_rate = 10
  274. order_line.onchange_goods_id()
  275. # partner 税率 > 采购调整单行商品税率
  276. self.env.ref('core.lenovo').tax_rate = 11
  277. self.env.ref('goods.cable').tax_rate = 10
  278. order_line.onchange_goods_id()
  279. # partner 税率 =< 入库单行商品税率
  280. self.env.ref('core.lenovo').tax_rate = 9
  281. self.env.ref('goods.cable').tax_rate = 10
  282. order_line.onchange_goods_id()
上海开阖软件有限公司 沪ICP备12045867号-1