from datetime import timedelta from odoo import api, Command, fields, models, _ class AccountDuplicateTransactionWizard(models.TransientModel): _name = 'account.duplicate.transaction.wizard' _description = 'Wizard for duplicate transactions' date = fields.Date( string="Starting Date", compute='_compute_date', readonly=False, store=True, ) journal_id = fields.Many2one( comodel_name='account.journal', domain="[('type', '=', 'bank')]", ) transaction_ids = fields.One2many( comodel_name='account.bank.statement.line', compute='_compute_transaction_ids', ) first_ids_in_group = fields.Json(compute='_compute_transaction_ids') provider_duplicate_ids = fields.One2many( comodel_name='account.bank.statement.line', compute='_compute_provider_duplicate_ids', ) @api.depends('journal_id') def _compute_display_name(self): for wizard in self: wizard.display_name = _('%s duplicate transactions', wizard.journal_id.name or '') @api.depends('journal_id', 'date') def _compute_transaction_ids(self): for wizard in self: ids_groups = wizard.journal_id._get_duplicate_transactions(wizard.date or fields.Date.today()) if wizard.journal_id else [] first_ids_in_group = [] flat_ids = [] check_set = set() for ids_group in ids_groups: group_set = set(ids_group) if not group_set & check_set: # list view not supposed to have the same line multiple times check_set.update(group_set) flat_ids.extend(ids_group) first_ids_in_group.append(ids_group[0]) wizard.write({'transaction_ids': [Command.set(flat_ids)]}) wizard.first_ids_in_group = first_ids_in_group @api.depends('journal_id', 'date') def _compute_provider_duplicate_ids(self): for wizard in self: wizard.provider_duplicate_ids = [Command.set(wizard.journal_id._get_provider_duplicate_transactions(wizard.date or fields.Date.today()) if wizard.journal_id else [])] @api.depends('journal_id') def _compute_date(self): for wizard in self: if wizard.date: continue last_bsl = self.env['account.bank.statement.line'].search_read( [], order='id desc', limit=1, fields=['create_date'] ) if last_bsl: # set date to the oldest transaction date of last sync batch bsl = self.env['account.bank.statement.line'].search_read( [('create_date', '>=', last_bsl[0]['create_date'] - timedelta(minutes=10))], order='date', limit=1, fields=['date'], ) wizard.date = bsl[0]['date'] else: wizard.date = fields.Datetime.today()