pos_online_payment/models/payment_transaction.py

81 lines
3.7 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models, tools
from odoo.exceptions import ValidationError
class PaymentTransaction(models.Model):
_inherit = 'payment.transaction'
pos_order_id = fields.Many2one('pos.order', string='POS Order', help='The Point of Sale order linked to the payment transaction', readonly=True)
@api.model
def _compute_reference_prefix(self, provider_code, separator, **values):
""" Override of payment to compute the reference prefix based on POS-specific values.
:return: The computed reference prefix if POS order id is found, the one of `super` otherwise
:rtype: str
"""
pos_order_id = values.get('pos_order_id')
if pos_order_id:
pos_order = self.env['pos.order'].sudo().browse(pos_order_id).exists()
if pos_order:
return pos_order.pos_reference
return super()._compute_reference_prefix(provider_code, separator, **values)
def _reconcile_after_done(self):
""" Override of payment to process POS online payments automatically. """
super()._reconcile_after_done()
self._process_pos_online_payment()
def _process_pos_online_payment(self):
for tx in self:
if tx and tx.pos_order_id and tx.state in ('authorized', 'done') and not tx.payment_id.pos_order_id:
pos_order = tx.pos_order_id
if tools.float_compare(tx.amount, 0.0, precision_rounding=pos_order.currency_id.rounding) <= 0:
raise ValidationError(_('The payment transaction (%d) has a negative amount.', tx.id))
if not tx.payment_id: # the payment could already have been created by account_payment module
tx._create_payment()
if not tx.payment_id:
raise ValidationError(_('The POS online payment (tx.id=%d) could not be saved correctly', tx.id))
payment_method = pos_order.online_payment_method_id
if not payment_method:
pos_config = pos_order.config_id
payment_method = self.env['pos.payment.method'].sudo()._get_or_create_online_payment_method(pos_config.company_id.id, pos_config.id)
if not payment_method:
raise ValidationError(_('The POS online payment (tx.id=%d) could not be saved correctly because the online payment method could not be found', tx.id))
pos_order.add_payment({
'amount': tx.amount,
'payment_date': tx.last_state_change,
'payment_method_id': payment_method.id,
'online_account_payment_id': tx.payment_id.id,
'pos_order_id': pos_order.id,
})
tx.payment_id.update({
'pos_payment_method_id': payment_method.id,
'pos_order_id': pos_order.id,
'pos_session_id': pos_order.session_id.id,
})
if pos_order.state == 'draft' and pos_order._is_pos_order_paid():
pos_order._process_saved_order(False)
pos_order._send_online_payments_notification_via_bus()
def action_view_pos_order(self):
""" Return the action for the view of the pos order linked to the transaction.
"""
self.ensure_one()
action = {
'name': _("POS Order"),
'type': 'ir.actions.act_window',
'res_model': 'pos.order',
'target': 'current',
'res_id': self.pos_order_id.id,
'view_mode': 'form'
}
return action