cashbook_dataexchange/qif_import_wiz.py
Frederik Jaeckel a2a761c979 formatting
2023-12-01 12:39:05 +01:00

272 lines
10 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of the cashbook-module from m-ds for Tryton.
# The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms.
from trytond.transaction import Transaction
from trytond.pool import Pool
from trytond.model import ModelView, fields
from trytond.wizard import Wizard, StateTransition, StateView, Button
from trytond.i18n import gettext
from trytond.pyson import Eval, Bool
from trytond.report import Report
class ImportQifWizardStart(ModelView):
'Import QIF-File'
__name__ = 'cashbook_dataexchange.qif_imp_wiz.start'
company = fields.Many2One(
model_name='company.company',
string="Company", required=True,
states={'invisible': True})
book = fields.Many2One(
string='Cashbook', readonly=True,
model_name='cashbook.book',
states={
'invisible': ~Bool(Eval('book'))})
file_ = fields.Binary(
string="QIF-File", required=True,
help='Quicken Interchange Format')
@classmethod
def default_company(cls):
return Transaction().context.get('company')
# end ImportQifWizardStart
class ImportQifWizardInfo(ModelView):
'Import QIF-File'
__name__ = 'cashbook_dataexchange.qif_imp_wiz.info'
company = fields.Many2One(
model_name='company.company', string="Company",
required=True, states={'invisible': True})
book = fields.Many2One(
string='Cash Book', readonly=True, model_name='cashbook.book',
states={
'invisible': ~Bool(Eval('book'))})
allowimport = fields.Boolean(
string='Import Enabled',
states={'invisible': True})
info = fields.Text(string='Information', readonly=True)
# end ImportQifWizardInfo
class ImportQifWizard(Wizard):
'Import QIF-File'
__name__ = 'cashbook_dataexchange.qif_imp_wiz'
start_state = 'start'
start = StateView(
model_name='cashbook_dataexchange.qif_imp_wiz.start',
view='cashbook_dataexchange.qif_imp_wiz_start_form',
buttons=[
Button(string='Cancel', state='end', icon='tryton-cancel'),
Button(
string='Read File', state='readf',
icon='tryton-forward', default=True)])
showinfo = StateView(
model_name='cashbook_dataexchange.qif_imp_wiz.info',
view='cashbook_dataexchange.qif_imp_wiz_info_form',
buttons=[
Button(string='Cancel', state='end', icon='tryton-cancel'),
Button(
string='Import Data', state='importf',
icon='tryton-import', default=True,
states={'readonly': ~Eval('allowimport', False)})])
readf = StateTransition()
importf = StateTransition()
def default_start(self, fields):
""" show book, company
"""
context = Transaction().context
values = {
'company': Transaction().context.get('company'),
'book': None}
model = context.get('active_model', '')
if model == 'cashbook.book':
values['book'] = context.get('active_id', None)
return values
def default_showinfo(self, fields):
""" show import-info
"""
values = {
'company': self.start.company.id,
'info': getattr(self.showinfo, 'info', None),
'book': getattr(getattr(self.start, 'book', None), 'id', None),
'allowimport': getattr(self.showinfo, 'allowimport', False),
}
return values
def transition_readf(self):
""" read file, show number of objects
"""
pool = Pool()
QifTool = pool.get('cashbook_dataexchange.qiftool')
Category = pool.get('cashbook.category')
model = Transaction().context.get('active_model', '')
file_content = None
if isinstance(self.start.file_, bytes):
file_content = self.start.file_.decode('utf8')
self.showinfo.allowimport = False
if model == 'cashbook.category':
def get_catlist(record, cattype, parent_name=None):
""" generate list of categories
"""
names = []
if record['cattype'] != cattype:
return []
if 'parent' in record.keys():
parent_name = Category(record['parent']).rec_name
name_lst = []
if parent_name:
name_lst.append(parent_name)
name_lst.append(record['name'])
current_name = '/'.join(name_lst)
names.append(current_name)
if 'childs' in record.keys():
# record['childs']: [('create', [{}, ...]))]
for x in record['childs'][0][1]:
names.extend(get_catlist(x, cattype, current_name))
return names
# read file content, extract categories
qif_content = QifTool.split_by_type(file_content)
if 'Cat' in qif_content.keys():
to_create = QifTool.convert_categories_to_create(
QifTool.qif_read_categories(qif_content['Cat']))
in_categories = []
out_categories = []
for x in to_create:
in_categories.extend(get_catlist(x, 'in'))
out_categories.extend(get_catlist(x, 'out'))
self.showinfo.info = gettext(
'cashbook_dataexchange.msg_wiz_categories_found',
categories='\n'.join(
[''] +
['%s (in)' % x for x in in_categories] +
[''] +
['%s (out)' % x for x in out_categories]
))
if len(to_create) > 0:
self.showinfo.allowimport = True
else:
self.showinfo.info = gettext(
'cashbook_dataexchange.msg_wiz_no_categories')
elif model == 'party.party':
# read file content, extract parties
qif_content = QifTool.split_by_type(file_content)
if 'Bank' in qif_content.keys():
to_create = QifTool.convert_parties_to_create(
QifTool.qif_read_transactions(qif_content['Bank']))
self.showinfo.info = gettext(
'cashbook_dataexchange.msg_wiz_parties_found',
numparties=len(to_create),
) + '\n\n' + '\n'.join([x['name'] for x in to_create])
if len(to_create) > 0:
self.showinfo.allowimport = True
else:
self.showinfo.info = gettext(
'cashbook_dataexchange.msg_wiz_no_bank')
elif model == 'cashbook.book':
info_lst = []
# read file content, extract categories
qif_content = QifTool.split_by_type(file_content)
if 'Bank' in qif_content.keys():
(to_create, msg_list, fail_cnt) = \
QifTool.convert_transactions_to_create(
self.start.book,
QifTool.qif_read_transactions(qif_content['Bank']))
if len(msg_list) > 0:
info_lst.append(gettext(
'cashbook_dataexchange.msg_wiz_transactions_error'))
info_lst.append('')
short_lst = []
for x in msg_list:
if x not in short_lst:
short_lst.append(x)
info_lst.extend(short_lst)
info_lst.append('')
# count
if fail_cnt == 0:
debit = sum([
x['amount'] for x in to_create
if x['bookingtype'] in ['out', 'mvout', 'spout']])
credit = sum([
x['amount'] for x in to_create
if x['bookingtype'] in ['in', 'mvin', 'spin']])
balance = credit - debit
if len(msg_list) > 0:
msg_list.append('')
info_lst.append(gettext(
'cashbook_dataexchange.msg_wiz_transactions_found',
quantity=len(to_create),
balance=Report.format_currency(
balance, None, self.start.book.currency),
credit=Report.format_currency(
credit, None, self.start.book.currency),
debit=Report.format_currency(
debit, None, self.start.book.currency)))
self.showinfo.allowimport = True
else:
info_lst.append(gettext(
'cashbook_dataexchange.msg_wiz_no_bank'))
self.showinfo.info = '\n'.join(info_lst)
return 'showinfo'
def transition_importf(self):
""" read file, show number of objects
"""
pool = Pool()
Category = pool.get('cashbook.category')
Book = pool.get('cashbook.book')
Line = pool.get('cashbook.line')
Party = pool.get('party.party')
QifTool = pool.get('cashbook_dataexchange.qiftool')
model = Transaction().context.get('active_model', '')
file_content = None
if isinstance(self.start.file_, bytes):
file_content = self.start.file_.decode('utf8')
if model == 'cashbook.category':
if file_content:
Category.create_from_qif(file_content)
elif model == 'cashbook.book':
if file_content:
Book.create_from_qif(self.showinfo.book, file_content)
lines = Line.search([
('cashbook.id', '=', self.showinfo.book.id),
('state', '=', 'edit')])
if len(lines) > 0:
Line.wfcheck(lines)
elif model == 'party.party':
qif_content = QifTool.split_by_type(file_content)
if 'Bank' in qif_content.keys():
to_create = QifTool.convert_parties_to_create(
QifTool.qif_read_transactions(qif_content['Bank'])
)
Party.create(to_create)
return 'end'
# end ImportQifWizard