# Fusion Accounting - CSV/XLS/XLSX Bank Statement Import # Registers spreadsheet formats and routes uploads to the base_import wizard from odoo import _, models from odoo.exceptions import UserError class FusionJournalCSVImport(models.Model): """Extends the journal import pipeline with CSV, XLS, and XLSX support. Uploads matching these formats are routed through the ``base_import`` wizard for column mapping.""" _inherit = 'account.journal' # ---- Format Registration ---- def _get_bank_statements_available_import_formats(self): """Append spreadsheet formats to the list of importable types.""" supported = super()._get_bank_statements_available_import_formats() supported.extend(['CSV', 'XLS', 'XLSX']) return supported # ---- Helpers ---- def _is_spreadsheet_file(self, filename): """Return True when *filename* has a CSV/XLS/XLSX extension.""" return bool( filename and filename.lower().strip().endswith(('.csv', '.xls', '.xlsx')) ) # ---- Import Override ---- def _import_bank_statement(self, attachments): """Intercept spreadsheet uploads and redirect them to the interactive column-mapping wizard. Non-spreadsheet files fall through to the standard import chain. Mixing CSV files with other formats or uploading more than one CSV file at a time is not permitted. """ if len(attachments) > 1: is_spreadsheet = [ bool(self._is_spreadsheet_file(att.name)) for att in attachments ] if True in is_spreadsheet and False in is_spreadsheet: raise UserError( _('Mixing CSV/XLS files with other file types is not allowed.') ) if is_spreadsheet.count(True) > 1: raise UserError(_('Only one CSV/XLS file can be selected at a time.')) return super()._import_bank_statement(attachments) if not self._is_spreadsheet_file(attachments.name): return super()._import_bank_statement(attachments) # Create the base_import wizard and launch the interactive mapper env_ctx = dict(self.env.context) wizard = self.env['base_import.import'].create({ 'res_model': 'account.bank.statement.line', 'file': attachments.raw, 'file_name': attachments.name, 'file_type': attachments.mimetype, }) env_ctx['wizard_id'] = wizard.id env_ctx['default_journal_id'] = self.id return { 'type': 'ir.actions.client', 'tag': 'import_bank_stmt', 'params': { 'model': 'account.bank.statement.line', 'context': env_ctx, 'filename': 'bank_statement_import.csv', }, }