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.
161 lines
5.1 KiB
161 lines
5.1 KiB
# Copyright 2018 GRAP - Sylvain LE GAL
|
|
# Copyright 2018 Tecnativa S.L. - David Vidal
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import api, models, fields
|
|
|
|
|
|
class PosOrder(models.Model):
|
|
_inherit = 'pos.order'
|
|
|
|
returned_order_id = fields.Many2one(
|
|
comodel_name='pos.order',
|
|
string='Returned Order',
|
|
readonly=True,
|
|
)
|
|
|
|
returned_order_reference = fields.Char(
|
|
related='returned_order_id.pos_reference',
|
|
string='Reference of the returned Order')
|
|
|
|
refund_order_ids = fields.One2many(
|
|
comodel_name='pos.order',
|
|
inverse_name='returned_order_id',
|
|
string='Refund Orders',
|
|
readonly=True,
|
|
)
|
|
|
|
refund_order_qty = fields.Integer(
|
|
compute='_compute_refund_order_qty',
|
|
string='Refund Orders Quantity',
|
|
)
|
|
|
|
@api.multi
|
|
@api.depends('refund_order_ids')
|
|
def _compute_refund_order_qty(self):
|
|
for order in self:
|
|
order.refund_order_qty = len(order.refund_order_ids)
|
|
|
|
@api.multi
|
|
def action_view_refund_orders(self):
|
|
self.ensure_one()
|
|
|
|
action = self.env.ref('point_of_sale.action_pos_pos_form').read()[0]
|
|
|
|
if self.refund_order_qty == 1:
|
|
action['views'] = [
|
|
(self.env.ref('point_of_sale.view_pos_pos_form').id, 'form')]
|
|
action['res_id'] = self.refund_order_ids.ids[0]
|
|
else:
|
|
action['domain'] = [('id', 'in', self.refund_order_ids.ids)]
|
|
return action
|
|
|
|
@api.multi
|
|
def refund(self):
|
|
return super(PosOrder, self.with_context(refund=True)).refund()
|
|
|
|
@api.multi
|
|
@api.returns('self', lambda value: value.id)
|
|
def copy(self, default=None):
|
|
self.ensure_one()
|
|
order = super().copy(default=default)
|
|
if self.env.context.get('refund', False):
|
|
order.returned_order_id = self.id
|
|
return order
|
|
|
|
@api.model
|
|
def _prepare_filter_for_pos(self, pos_session_id):
|
|
return [
|
|
('state', 'in', ['paid', 'done', 'invoiced']),
|
|
]
|
|
|
|
@api.model
|
|
def _prepare_filter_query_for_pos(self, pos_session_id, query):
|
|
return [
|
|
'|', '|',
|
|
('name', 'ilike', query),
|
|
('pos_reference', 'ilike', query),
|
|
('partner_id.display_name', 'ilike', query),
|
|
]
|
|
|
|
@api.model
|
|
def _prepare_fields_for_pos_list(self):
|
|
return [
|
|
'name', 'pos_reference', 'partner_id', 'date_order',
|
|
'amount_total',
|
|
]
|
|
|
|
@api.model
|
|
def search_done_orders_for_pos(self, query, pos_session_id):
|
|
session_obj = self.env['pos.session']
|
|
config = session_obj.browse(pos_session_id).config_id
|
|
condition = self._prepare_filter_for_pos(pos_session_id)
|
|
if not query:
|
|
# Search only this POS orders
|
|
condition += [('config_id', '=', config.id)]
|
|
else:
|
|
# Search globally by criteria
|
|
condition += self._prepare_filter_query_for_pos(
|
|
pos_session_id, query)
|
|
field_names = self._prepare_fields_for_pos_list()
|
|
return self.search_read(
|
|
condition, field_names, limit=config.iface_load_done_order_max_qty)
|
|
|
|
@api.multi
|
|
def _prepare_done_order_for_pos(self):
|
|
self.ensure_one()
|
|
order_lines = []
|
|
payment_lines = []
|
|
for order_line in self.lines:
|
|
order_line = self._prepare_done_order_line_for_pos(order_line)
|
|
order_lines.append(order_line)
|
|
for payment_line in self.statement_ids:
|
|
payment_line = self._prepare_done_order_payment_for_pos(
|
|
payment_line)
|
|
payment_lines.append(payment_line)
|
|
res = {
|
|
'id': self.id,
|
|
'date_order': self.date_order,
|
|
'pos_reference': self.pos_reference,
|
|
'name': self.name,
|
|
'partner_id': self.partner_id.id,
|
|
'fiscal_position': self.fiscal_position_id.id,
|
|
'line_ids': order_lines,
|
|
'statement_ids': payment_lines,
|
|
'to_invoice': bool(self.invoice_id),
|
|
'returned_order_id': self.returned_order_id.id,
|
|
'returned_order_reference': self.returned_order_reference,
|
|
}
|
|
return res
|
|
|
|
@api.multi
|
|
def _prepare_done_order_line_for_pos(self, order_line):
|
|
self.ensure_one()
|
|
return {
|
|
'product_id': order_line.product_id.id,
|
|
'qty': order_line.qty,
|
|
'price_unit': order_line.price_unit,
|
|
'discount': order_line.discount,
|
|
'pack_lot_names': order_line.pack_lot_ids.mapped('lot_name'),
|
|
}
|
|
|
|
@api.multi
|
|
def _prepare_done_order_payment_for_pos(self, payment_line):
|
|
self.ensure_one()
|
|
return {
|
|
'journal_id': payment_line.journal_id.id,
|
|
'amount': payment_line.amount,
|
|
}
|
|
|
|
@api.multi
|
|
def load_done_order_for_pos(self):
|
|
self.ensure_one()
|
|
return self._prepare_done_order_for_pos()
|
|
|
|
@api.model
|
|
def _order_fields(self, ui_order):
|
|
res = super()._order_fields(ui_order)
|
|
res.update({
|
|
'returned_order_id': ui_order.get('returned_order_id', False),
|
|
})
|
|
return res
|