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.

127 lines
5.1 KiB

  1. # Copyright 2018 Tecnativa - David Vidal
  2. # Copyright 2018 Lambda IS DOOEL <https://www.lambda-is.com>
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo.tests import common
  5. @common.at_install(False)
  6. @common.post_install(True)
  7. class TestPOSOrderReturn(common.HttpCase):
  8. def setUp(self):
  9. super(TestPOSOrderReturn, self).setUp()
  10. self.pricelist = self.env['product.pricelist'].create({
  11. 'name': 'Test pricelist',
  12. 'item_ids': [(0, 0, {
  13. 'applied_on': '3_global',
  14. 'compute_price': 'formula',
  15. 'base': 'list_price',
  16. })]
  17. })
  18. self.partner = self.env['res.partner'].create({
  19. 'name': 'Mr. Odoo',
  20. 'property_product_pricelist': self.pricelist.id,
  21. })
  22. self.product_1 = self.env['product.product'].create({
  23. 'name': 'Test product 1',
  24. 'standard_price': 1.0,
  25. 'type': 'product',
  26. 'pos_allow_negative_qty': False,
  27. 'taxes_id': False,
  28. })
  29. self.product_2 = self.env['product.product'].create({
  30. 'name': 'Test product 2',
  31. 'standard_price': 1.0,
  32. 'type': 'product',
  33. 'pos_allow_negative_qty': True,
  34. 'taxes_id': False,
  35. })
  36. self.PosOrder = self.env['pos.order']
  37. self.pos_config = self.env.ref('point_of_sale.pos_config_main')
  38. self.pos_config.write({
  39. 'available_pricelist_ids': [(6, 0, self.pricelist.ids)],
  40. 'pricelist_id': self.pricelist.id,
  41. })
  42. self.pos_config.open_session_cb()
  43. self.pos_order = self.PosOrder.create({
  44. 'session_id': self.pos_config.current_session_id.id,
  45. 'partner_id': self.partner.id,
  46. 'pricelist_id': self.partner.property_product_pricelist.id,
  47. 'amount_tax': 0,
  48. 'amount_total': 2700,
  49. 'amount_paid': 2700,
  50. 'amount_return': 0,
  51. 'lines': [
  52. (0, 0, {
  53. 'name': 'POSLINE/0001',
  54. 'product_id': self.product_1.id,
  55. 'price_unit': 450,
  56. 'price_subtotal': 450,
  57. 'price_subtotal_incl': 450,
  58. 'qty': 2.0,
  59. }),
  60. (0, 0, {
  61. 'name': 'POSLINE/0002',
  62. 'product_id': self.product_2.id,
  63. 'price_unit': 450,
  64. 'price_subtotal': 450,
  65. 'price_subtotal_incl': 450,
  66. 'qty': 2.0,
  67. }),
  68. (0, 0, {
  69. 'name': 'POSLINE/0003',
  70. 'product_id': self.product_1.id,
  71. 'price_unit': 450,
  72. 'price_subtotal': 450,
  73. 'price_subtotal_incl': 450,
  74. 'qty': 2.0,
  75. }),
  76. ],
  77. })
  78. pos_make_payment = self.env['pos.make.payment'].with_context({
  79. 'active_ids': [self.pos_order.id],
  80. 'active_id': self.pos_order.id,
  81. }).create({})
  82. pos_make_payment.with_context(active_id=self.pos_order.id).check()
  83. self.pos_order.create_picking()
  84. res = self.pos_order.action_pos_order_invoice()
  85. self.invoice = self.env['account.invoice'].browse(res['res_id'])
  86. def test_pos_order_full_refund(self):
  87. self.pos_order.refund()
  88. refund_order = self.pos_order.refund_order_ids
  89. self.assertEqual(len(refund_order), 1)
  90. pos_make_payment = self.env['pos.make.payment'].with_context({
  91. 'active_ids': refund_order.ids,
  92. 'active_id': refund_order.id,
  93. }).create({})
  94. pos_make_payment.with_context(active_id=refund_order.id).check()
  95. refund_invoice = refund_order.invoice_id
  96. self.assertEqual(refund_invoice.refund_invoice_id, self.invoice)
  97. # Partner balance is 0
  98. self.assertEqual(sum(
  99. self.partner.mapped('invoice_ids.amount_total_signed')), 0)
  100. self.assertEqual(self.pos_order.picking_id.state, 'done')
  101. def test_pos_order_partial_refund(self):
  102. partial_refund = self.env['pos.partial.return.wizard'].with_context({
  103. 'active_ids': self.pos_order.ids,
  104. 'active_id': self.pos_order.id,
  105. }).create({})
  106. # Return just 1 item from line POSLINE/0001
  107. partial_refund.line_ids[0].qty = 1
  108. # Return 2 items from line POSLINE/0003
  109. partial_refund.line_ids[1].qty = 2
  110. partial_refund.confirm()
  111. refund_order = self.pos_order.refund_order_ids
  112. self.assertEqual(len(refund_order), 1)
  113. self.assertEqual(len(refund_order.lines), 2)
  114. pos_make_payment = self.env['pos.make.payment'].with_context({
  115. 'active_ids': refund_order.ids,
  116. 'active_id': refund_order.id,
  117. }).create({})
  118. pos_make_payment.with_context(active_id=refund_order.id).check()
  119. # Partner balance is 1350
  120. self.assertEqual(sum(
  121. self.partner.mapped('invoice_ids.amount_total_signed')), 1350)
  122. self.assertEqual(self.pos_order.picking_id.state, 'done')