from odoo import fields, models from odoo.addons.payment.logging import get_payment_logger from odoo.addons.community_interac.controllers.main import InteracController _logger = get_payment_logger(__name__) class PaymentTransaction(models.Model): _inherit = 'payment.transaction' def _get_specific_rendering_values(self, processing_values): if self.provider_code != 'interac': return super()._get_specific_rendering_values(processing_values) return { 'api_url': InteracController._process_url, 'reference': self.reference, } def _extract_amount_data(self, payment_data): """Override of `payment` to skip amount validation - there is no external gateway response.""" if self.provider_code != 'interac': return super()._extract_amount_data(payment_data) return None def _apply_updates(self, payment_data): if self.provider_code != 'interac': return super()._apply_updates(payment_data) _logger.info("Interac transaction %s selected by customer: set as pending.", self.reference) self._set_pending() self._send_interac_instructions_email() def _send_interac_instructions_email(self): self.ensure_one() template = self.env.ref('community_interac.mail_template_interac_instructions', raise_if_not_found=False) if template: template.send_mail(self.id, force_send=False) def _send_interac_cancel_email(self): self.ensure_one() template = self.env.ref('community_interac.mail_template_interac_cancelled', raise_if_not_found=False) if template: template.send_mail(self.id, force_send=False) def action_confirm_interac_payment(self): """One-click admin/treasurer confirmation that the e-transfer was received.""" for tx in self: if tx.provider_code == 'interac' and tx.state == 'pending': tx._set_done() return True def _cron_auto_cancel_interac(self): pending_interac = self.search([('provider_code', '=', 'interac'), ('state', '=', 'pending')]) for tx in pending_interac: deadline_hours = tx.provider_id.interac_deadline_hours or 48 elapsed_hours = (fields.Datetime.now() - tx.last_state_change).total_seconds() / 3600.0 if elapsed_hours >= deadline_hours: tx._set_canceled(state_message="Auto-cancelled: Interac payment not confirmed within the deadline.") tx._send_interac_cancel_email() return True