"""Per-request widget state. Holds the kanban-load response shape so the controller can return one well-typed object. This is a TransientModel (no DB persistence beyond the request). The OWL widget reads pre-computed fusion.reconcile.suggestion rows directly via the controller; this model is just a typed envelope for the kanban-open action.""" from odoo import api, fields, models class FusionBankRecWidget(models.TransientModel): _name = "fusion.bank.rec.widget" _description = "Bank reconciliation widget state (transient)" journal_id = fields.Many2one('account.journal', domain="[('type', '=', 'bank')]") statement_line_ids = fields.Many2many('account.bank.statement.line') summary_count = fields.Integer( help="Number of unreconciled lines visible in this widget") summary_unreconciled_balance = fields.Monetary(currency_field='currency_id') currency_id = fields.Many2one('res.currency', related='journal_id.currency_id', store=False, readonly=True) def action_open_kanban(self): """Return a window action opening the OWL kanban for this journal.""" self.ensure_one() return { 'type': 'ir.actions.client', 'tag': 'fusion_bank_rec_kanban', 'params': {'journal_id': self.journal_id.id}, }