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.
77 lines
2.5 KiB
77 lines
2.5 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
|
|
)
|
|
|
|
line_ids = fields.One2many(
|
|
comodel_name="pos.payment.change.wizard.line",
|
|
inverse_name="wizard_id",
|
|
string="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"))
|
|
res.update({"order_id": order.id})
|
|
res.update({"amount_total": order.amount_total})
|
|
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 = 0
|
|
for line in self.line_ids:
|
|
total += line.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.line_ids]
|
|
|
|
orders = order.change_payment(new_payments)
|
|
|
|
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
|