69 lines
3.5 KiB
Python
69 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import models, fields, api, tools
|
|
from odoo.osv import expression
|
|
|
|
|
|
class PosOrder(models.Model):
|
|
_inherit = 'pos.order'
|
|
|
|
use_self_order_online_payment = fields.Boolean(compute='_compute_use_self_order_online_payment', store=True, readonly=True)
|
|
|
|
@api.depends('config_id.self_order_online_payment_method_id')
|
|
def _compute_use_self_order_online_payment(self):
|
|
for order in self:
|
|
order.use_self_order_online_payment = bool(order.config_id.self_order_online_payment_method_id)
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
for vals in vals_list:
|
|
if 'use_self_order_online_payment' not in vals or vals['use_self_order_online_payment']:
|
|
session = self.env['pos.session'].browse(vals['session_id'])
|
|
config = session.config_id
|
|
vals['use_self_order_online_payment'] = bool(config.self_order_online_payment_method_id)
|
|
return super().create(vals_list)
|
|
|
|
def write(self, vals):
|
|
# Because use_self_order_online_payment is not intended to be changed manually,
|
|
# avoid to raise an error.
|
|
if 'use_self_order_online_payment' not in vals:
|
|
return super().write(vals)
|
|
|
|
can_change_self_order_domain = [('state', '=', 'draft')]
|
|
if vals['use_self_order_online_payment']:
|
|
can_change_self_order_domain = expression.AND([can_change_self_order_domain, [('config_id.self_order_online_payment_method_id', '!=', False)]])
|
|
|
|
can_change_self_order_orders = self.filtered_domain(can_change_self_order_domain)
|
|
cannot_change_self_order_orders = self - can_change_self_order_orders
|
|
|
|
res = True
|
|
if can_change_self_order_orders:
|
|
res = super(PosOrder, can_change_self_order_orders).write(vals) and res
|
|
if cannot_change_self_order_orders:
|
|
clean_vals = vals.copy()
|
|
clean_vals.pop('use_self_order_online_payment', None)
|
|
res = super(PosOrder, cannot_change_self_order_orders).write(clean_vals) and res
|
|
|
|
return res
|
|
|
|
@api.depends('use_self_order_online_payment', 'config_id.self_order_online_payment_method_id', 'config_id.payment_method_ids')
|
|
def _compute_online_payment_method_id(self):
|
|
for order in self:
|
|
if order.use_self_order_online_payment:
|
|
# It is expected to use the self order online payment method.
|
|
# If for any reason it is not defined, then the online payment
|
|
# of the order is set to null to make the problem noticeable.
|
|
order.online_payment_method_id = order.config_id.self_order_online_payment_method_id
|
|
else:
|
|
super(PosOrder, order)._compute_online_payment_method_id()
|
|
|
|
def get_and_set_online_payments_data(self, next_online_payment_amount=False):
|
|
res = super().get_and_set_online_payments_data(next_online_payment_amount)
|
|
if 'paid_order' not in res and not res.get('deleted', False) and not isinstance(next_online_payment_amount, bool):
|
|
# This method is only called in the POS frontend flow, not self order.
|
|
# If the next online payment is 0, then the online payment of the frontend
|
|
# flow is cancelled, and the default flow is self order if it is configured.
|
|
self.use_self_order_online_payment = tools.float_is_zero(next_online_payment_amount, precision_rounding=self.currency_id.rounding) and self.config_id.self_order_online_payment_method_id
|
|
return res
|