92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import logging
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
_inherit = 'sale.order'
|
|
|
|
poynt_transaction_count = fields.Integer(
|
|
string="Poynt Transactions",
|
|
compute='_compute_poynt_transaction_count',
|
|
)
|
|
|
|
def _compute_poynt_transaction_count(self):
|
|
for order in self:
|
|
order.poynt_transaction_count = self.env['payment.transaction'].sudo().search_count([
|
|
('sale_order_ids', 'in', order.id),
|
|
('provider_code', '=', 'poynt'),
|
|
])
|
|
|
|
def action_view_poynt_transactions(self):
|
|
self.ensure_one()
|
|
transactions = self.env['payment.transaction'].sudo().search([
|
|
('sale_order_ids', 'in', self.id),
|
|
('provider_code', '=', 'poynt'),
|
|
])
|
|
action = {
|
|
'name': _("Poynt Transactions"),
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'payment.transaction',
|
|
'domain': [('id', 'in', transactions.ids)],
|
|
}
|
|
if len(transactions) == 1:
|
|
action['view_mode'] = 'form'
|
|
action['res_id'] = transactions.id
|
|
else:
|
|
action['view_mode'] = 'list,form'
|
|
return action
|
|
|
|
def action_poynt_collect_payment(self):
|
|
"""Create an invoice (if needed) and open the Poynt payment wizard.
|
|
|
|
This shortcut lets staff collect payment directly from a confirmed
|
|
sale order without manually creating and posting the invoice first.
|
|
"""
|
|
self.ensure_one()
|
|
|
|
if self.state not in ('sale', 'done'):
|
|
raise UserError(
|
|
_("You can only collect payment on confirmed orders.")
|
|
)
|
|
|
|
invoice = self.invoice_ids.filtered(
|
|
lambda inv: inv.state == 'posted'
|
|
and inv.payment_state in ('not_paid', 'partial')
|
|
and inv.move_type == 'out_invoice'
|
|
)[:1]
|
|
|
|
if not invoice:
|
|
draft_invoices = self.invoice_ids.filtered(
|
|
lambda inv: inv.state == 'draft'
|
|
and inv.move_type == 'out_invoice'
|
|
)
|
|
if draft_invoices:
|
|
invoice = draft_invoices[0]
|
|
invoice.action_post()
|
|
else:
|
|
invoices = self._create_invoices()
|
|
if not invoices:
|
|
raise UserError(
|
|
_("Could not create an invoice for this order.")
|
|
)
|
|
invoice = invoices[0]
|
|
invoice.action_post()
|
|
|
|
return {
|
|
'name': _("Collect Poynt Payment"),
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'poynt.payment.wizard',
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
'context': {
|
|
'active_model': 'account.move',
|
|
'active_id': invoice.id,
|
|
},
|
|
}
|