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.

80 lines
2.5 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2016-Today: La Louve (<http://www.lalouve.net/>)
  3. # @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  5. from openerp import fields, models, api
  6. from openerp.addons import decimal_precision as dp
  7. class PosOrder(models.Model):
  8. _inherit = 'pos.order'
  9. # Column Section
  10. returned_order_id = fields.Many2one(
  11. comodel_name='pos.order', string='Returned Order', readonly=True)
  12. refund_order_ids = fields.One2many(
  13. comodel_name='pos.order', inverse_name='returned_order_id',
  14. string='Refund Orders', readonly=True)
  15. refund_order_qty = fields.Integer(
  16. compute='_compute_refund_order_qty', string='Refund Orders Quantity',
  17. digits=dp.get_precision('Product Unit of Measure'))
  18. # Compute Section
  19. @api.multi
  20. def _compute_refund_order_qty(self):
  21. for order in self:
  22. order.refund_order_qty = len(order.refund_order_ids)
  23. @api.multi
  24. def _blank_refund(self):
  25. self.ensure_one()
  26. # Call super to use original refund algorithm (session management, ...)
  27. ctx = self.env.context.copy()
  28. ctx.update({'do_not_check_negative_qty': True})
  29. res = super(PosOrder, self.with_context(ctx)).refund()
  30. # Link Order
  31. original_order = self[0]
  32. new_order = self.browse(res['res_id'])
  33. new_order.returned_order_id = original_order.id
  34. # Remove created lines and recreate and link Lines
  35. new_order.lines.unlink()
  36. return res, new_order
  37. # Action Section
  38. @api.multi
  39. def refund(self):
  40. res, new_order = self._blank_refund()
  41. for line in self[0].lines:
  42. qty = - line.max_returnable_qty([])
  43. if qty != 0:
  44. copy_line = line.copy()
  45. copy_line.write({
  46. 'order_id': new_order.id,
  47. 'returned_line_id': line.id,
  48. 'qty': qty,
  49. })
  50. return res
  51. # Action Section
  52. @api.multi
  53. def partial_refund(self, partial_return_wizard):
  54. res, new_order = self._blank_refund()
  55. for wizard_line in partial_return_wizard.line_ids:
  56. qty = - wizard_line.qty
  57. if qty != 0:
  58. copy_line = wizard_line.pos_order_line_id.copy()
  59. copy_line.write({
  60. 'order_id': new_order.id,
  61. 'returned_line_id': wizard_line.pos_order_line_id.id,
  62. 'qty': qty,
  63. })
  64. return res