You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
6.4 KiB
191 lines
6.4 KiB
# Copyright 2019 ForgeFlow, S.L.
|
|
# Copyright 2020 Brainbean Apps (https://brainbeanapps.com)
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
from base64 import b64decode
|
|
import json
|
|
from os import path
|
|
|
|
|
|
class AccountBankStatementImportSheetMappingWizard(models.TransientModel):
|
|
_name = 'account.bank.statement.import.sheet.mapping.wizard'
|
|
_description = 'Account Bank Statement Import Sheet Mapping Wizard'
|
|
_inherit = ['multi.step.wizard.mixin']
|
|
|
|
data_file = fields.Binary(
|
|
string='Bank Statement File',
|
|
required=True,
|
|
)
|
|
filename = fields.Char()
|
|
header = fields.Char()
|
|
file_encoding = fields.Selection(
|
|
string='Encoding',
|
|
selection=lambda self: self._selection_file_encoding(),
|
|
)
|
|
delimiter = fields.Selection(
|
|
string='Delimiter',
|
|
selection=lambda self: self._selection_delimiter(),
|
|
)
|
|
quotechar = fields.Char(
|
|
string='Text qualifier',
|
|
size=1,
|
|
)
|
|
timestamp_column = fields.Char(
|
|
string='Timestamp column',
|
|
)
|
|
currency_column = fields.Char(
|
|
string='Currency column',
|
|
help=(
|
|
'In case statement is multi-currency, column to get currency of '
|
|
'transaction from'
|
|
),
|
|
)
|
|
amount_column = fields.Char(
|
|
string='Amount column',
|
|
help='Amount of transaction in journal\'s currency',
|
|
)
|
|
balance_column = fields.Char(
|
|
string='Balance column',
|
|
help='Balance after transaction in journal\'s currency',
|
|
)
|
|
original_currency_column = fields.Char(
|
|
string='Original currency column',
|
|
help=(
|
|
'In case statement provides original currency for transactions '
|
|
'with automatic currency conversion, column to get original '
|
|
'currency of transaction from'
|
|
),
|
|
)
|
|
original_amount_column = fields.Char(
|
|
string='Original amount column',
|
|
help=(
|
|
'In case statement provides original currency for transactions '
|
|
'with automatic currency conversion, column to get original '
|
|
'transaction amount in original transaction currency from'
|
|
),
|
|
)
|
|
debit_credit_column = fields.Char(
|
|
string='Debit/credit column',
|
|
help=(
|
|
'Some statement formats use absolute amount value and indicate sign'
|
|
'of the transaction by specifying if it was a debit or a credit one'
|
|
),
|
|
)
|
|
debit_value = fields.Char(
|
|
string='Debit value',
|
|
help='Value of debit/credit column that indicates if it\'s a debit',
|
|
default='D',
|
|
)
|
|
credit_value = fields.Char(
|
|
string='Credit value',
|
|
help='Value of debit/credit column that indicates if it\'s a credit',
|
|
default='C',
|
|
)
|
|
transaction_id_column = fields.Char(
|
|
string='Unique transaction ID column',
|
|
)
|
|
description_column = fields.Char(
|
|
string='Description column',
|
|
)
|
|
notes_column = fields.Char(
|
|
string='Notes column',
|
|
)
|
|
reference_column = fields.Char(
|
|
string='Reference column',
|
|
)
|
|
partner_name_column = fields.Char(
|
|
string='Partner Name column',
|
|
)
|
|
bank_name_column = fields.Char(
|
|
string='Bank Name column',
|
|
help='Partner\'s bank',
|
|
)
|
|
bank_account_column = fields.Char(
|
|
string='Bank Account column',
|
|
help='Partner\'s bank account',
|
|
)
|
|
|
|
@api.model
|
|
def _selection_file_encoding(self):
|
|
return self.env['account.bank.statement.import.sheet.mapping']._fields[
|
|
'file_encoding'
|
|
].selection
|
|
|
|
@api.model
|
|
def _selection_delimiter(self):
|
|
return self.env['account.bank.statement.import.sheet.mapping']._fields[
|
|
'delimiter'
|
|
].selection
|
|
|
|
@api.onchange('data_file')
|
|
def _onchange_data_file(self):
|
|
Parser = self.env['account.bank.statement.import.sheet.parser']
|
|
Mapping = self.env['account.bank.statement.import.sheet.mapping']
|
|
if not self.data_file:
|
|
return
|
|
csv_options = {}
|
|
if self.delimiter:
|
|
csv_options['delimiter'] = \
|
|
Mapping._decode_column_delimiter_character(self.delimiter)
|
|
if self.quotechar:
|
|
csv_options['quotechar'] = self.quotechar
|
|
header = Parser.parse_header(
|
|
b64decode(self.data_file),
|
|
self.file_encoding,
|
|
csv_options
|
|
)
|
|
self.header = json.dumps(header)
|
|
|
|
@api.model
|
|
def statement_columns(self):
|
|
header = self.env.context.get('header')
|
|
if not header:
|
|
return []
|
|
return [(x, x) for x in json.loads(header)]
|
|
|
|
@api.multi
|
|
def _get_mapping_values(self):
|
|
"""Hook for extension"""
|
|
self.ensure_one()
|
|
return {
|
|
'name': _('Mapping from %s') % path.basename(self.filename),
|
|
'float_thousands_sep': 'comma',
|
|
'float_decimal_sep': 'dot',
|
|
'file_encoding': self.file_encoding,
|
|
'delimiter': self.delimiter,
|
|
'quotechar': self.quotechar,
|
|
'timestamp_format': '%d/%m/%Y',
|
|
'timestamp_column': self.timestamp_column,
|
|
'currency_column': self.currency_column,
|
|
'amount_column': self.amount_column,
|
|
'balance_column': self.balance_column,
|
|
'original_currency_column': self.original_currency_column,
|
|
'original_amount_column': self.original_amount_column,
|
|
'debit_credit_column': self.debit_credit_column,
|
|
'debit_value': self.debit_value,
|
|
'credit_value': self.credit_value,
|
|
'transaction_id_column': self.transaction_id_column,
|
|
'description_column': self.description_column,
|
|
'notes_column': self.notes_column,
|
|
'reference_column': self.reference_column,
|
|
'partner_name_column': self.partner_name_column,
|
|
'bank_name_column': self.bank_name_column,
|
|
'bank_account_column': self.bank_account_column,
|
|
}
|
|
|
|
@api.multi
|
|
def import_mapping(self):
|
|
self.ensure_one()
|
|
mapping = self.env['account.bank.statement.import.sheet.mapping']\
|
|
.create(self._get_mapping_values())
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': _('Imported Mapping'),
|
|
'res_model': 'account.bank.statement.import.sheet.mapping',
|
|
'res_id': mapping.id,
|
|
'view_mode': 'form',
|
|
'view_id': False,
|
|
'target': 'current',
|
|
}
|