85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from io import BytesIO, TextIOWrapper
|
|
|
|
from aeb43 import AEB43
|
|
|
|
from trytond.i18n import gettext
|
|
from trytond.modules.account_statement.exceptions import ImportStatementError
|
|
from trytond.pool import Pool, PoolMeta
|
|
|
|
|
|
class ImportStatementStart(metaclass=PoolMeta):
|
|
__name__ = 'account.statement.import.start'
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super().__setup__()
|
|
aeb43 = ('aeb43', 'AEB Norm 43')
|
|
cls.file_format.selection.append(aeb43)
|
|
|
|
|
|
class ImportStatement(metaclass=PoolMeta):
|
|
__name__ = 'account.statement.import'
|
|
|
|
def parse_aeb43(self, encoding='iso-8859-1'):
|
|
file_ = TextIOWrapper(BytesIO(self.start.file_), encoding=encoding)
|
|
aeb43 = AEB43(file_)
|
|
|
|
for account in aeb43.accounts:
|
|
statement = self.aeb43_statement(account)
|
|
origins = []
|
|
for transaction in account.transactions:
|
|
origins.extend(self.aeb43_origin(statement, transaction))
|
|
statement.origins = origins
|
|
yield statement
|
|
|
|
def aeb43_statement(self, account):
|
|
pool = Pool()
|
|
Statement = pool.get('account.statement')
|
|
Journal = pool.get('account.statement.journal')
|
|
|
|
journal = Journal.get_by_bank_account(
|
|
self.start.company, account.ccc, currency=account.currency)
|
|
if not journal:
|
|
journal = Journal.get_by_bank_account(
|
|
self.start.company, account.iban, currency=account.currency)
|
|
if not journal:
|
|
raise ImportStatementError(
|
|
gettext('account_statement.msg_import_no_journal',
|
|
account=account.ccc))
|
|
|
|
statement = Statement()
|
|
statement.name = '%(start_date)s - %(end_date)s' % {
|
|
'start_date': account.start_date,
|
|
'end_date': account.end_date,
|
|
}
|
|
statement.company = self.start.company
|
|
statement.journal = journal
|
|
statement.date = account.end_date
|
|
statement.start_balance = account.initial_balance
|
|
statement.end_balance = account.final_balance
|
|
statement.number_of_lines = len(account.transactions)
|
|
statement.total_amount = (
|
|
account.final_balance - account.initial_balance)
|
|
return statement
|
|
|
|
def aeb43_origin(self, statement, transaction):
|
|
pool = Pool()
|
|
Origin = pool.get('account.statement.origin')
|
|
origin = Origin()
|
|
origin.date = transaction.transaction_date
|
|
origin.amount = transaction.amount
|
|
origin.description = ''.join(transaction.items)
|
|
origin.information = self.aeb43_information(statement, transaction)
|
|
return [origin]
|
|
|
|
def aeb43_information(self, statement, transaction):
|
|
return {
|
|
'aeb43_operation_date': transaction.transaction_date,
|
|
'aeb43_record_type': transaction.shared_item,
|
|
'aeb43_document_number': transaction.document,
|
|
'aeb43_first_reference': transaction.reference1,
|
|
'aeb43_second_reference': transaction.reference2,
|
|
}
|