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

# Copyright 2019 ForgeFlow, S.L.
# Copyright 2020 CorporateHub (https://corporatehub.eu)
# 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',
}