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.
98 lines
3.3 KiB
98 lines
3.3 KiB
# Copyright (C) 2015-Today GRAP (http://www.grap.coop)
|
|
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import Warning as UserError
|
|
|
|
|
|
class PosPaymentChangeWizard(models.TransientModel):
|
|
_name = "pos.payment.change.wizard"
|
|
_description = "PoS Payment Change Wizard"
|
|
|
|
# Column Section
|
|
order_id = fields.Many2one(
|
|
comodel_name="pos.order", string="Order", readonly=True
|
|
)
|
|
|
|
old_line_ids = fields.One2many(
|
|
comodel_name="pos.payment.change.wizard.old.line",
|
|
inverse_name="wizard_id",
|
|
string="Old Payment Lines",
|
|
readonly=True,
|
|
)
|
|
|
|
new_line_ids = fields.One2many(
|
|
comodel_name="pos.payment.change.wizard.new.line",
|
|
inverse_name="wizard_id",
|
|
string="New Payment Lines",
|
|
)
|
|
|
|
amount_total = fields.Float(string="Total", readonly=True)
|
|
|
|
# View Section
|
|
@api.model
|
|
def default_get(self, fields):
|
|
PosOrder = self.env["pos.order"]
|
|
res = super().default_get(fields)
|
|
order = PosOrder.browse(self._context.get("active_id"))
|
|
old_lines_vals = []
|
|
for statement_line in order.statement_ids:
|
|
old_lines_vals.append((0, 0, {
|
|
"old_journal_id": statement_line.statement_id.journal_id.id,
|
|
"amount": statement_line.amount
|
|
}
|
|
))
|
|
res.update({
|
|
"order_id": order.id,
|
|
"amount_total": order.amount_total,
|
|
"old_line_ids": old_lines_vals,
|
|
})
|
|
return res
|
|
|
|
# View section
|
|
@api.multi
|
|
def button_change_payment(self):
|
|
self.ensure_one()
|
|
order = self.order_id
|
|
|
|
# Check if the total is correct
|
|
total = sum(self.mapped("new_line_ids.amount"))
|
|
if total != self.amount_total:
|
|
raise UserError(
|
|
_(
|
|
"Differences between the two values for the POS"
|
|
" Order '%s':\n\n"
|
|
" * Total of all the new payments %s;\n"
|
|
" * Total of the POS Order %s;\n\n"
|
|
"Please change the payments."
|
|
% (order.name, total, order.amount_total)
|
|
)
|
|
)
|
|
|
|
# Change payment
|
|
new_payments = [{
|
|
"journal": line.new_journal_id.id,
|
|
"amount": line.amount,
|
|
"payment_date": fields.Date.context_today(self),
|
|
} for line in self.new_line_ids]
|
|
|
|
orders = order.change_payment(new_payments)
|
|
|
|
# Note. Because of the poor design of the closing session process
|
|
# in Odoo, we call _check_pos_session_balance() that sets
|
|
# balance_end_real with balance_end for "non cash" journals
|
|
if order.session_id.state == "closing_control":
|
|
order.session_id._check_pos_session_balance()
|
|
|
|
if len(orders) == 1:
|
|
# if policy is 'update', only close the pop up
|
|
action = {'type': 'ir.actions.act_window_close'}
|
|
else:
|
|
# otherwise (refund policy), displays the 3 orders
|
|
action = self.env.ref(
|
|
"point_of_sale.action_pos_pos_form"
|
|
).read()[0]
|
|
action['domain'] = [('id', 'in', orders.ids)]
|
|
|
|
return action
|