Compare commits

..

22 commits

Author SHA1 Message Date
Frederik Jaeckel
978823faf7 Version 6.0.4 2023-02-14 10:48:29 +01:00
Frederik Jaeckel
492befca04 setup.py 2023-02-14 10:47:30 +01:00
Frederik Jaeckel
0c2bae0663 test korrigiert 2022-09-16 10:40:28 +02:00
Frederik Jaeckel
70c4741c9d Etikett ver 6.0.3 zum Änderungssatz a67229652aa8 hinzugefügt 2022-09-13 23:09:45 +02:00
Frederik Jaeckel
eb8c1baa1b Version 6.0.3 2022-09-13 23:09:38 +02:00
Frederik Jaeckel
803262e202 test für splitbuchung mit transfer 2022-09-13 22:19:20 +02:00
Frederik Jaeckel
c5b3277622 splitbuchung: konvertiert transfers + test 2022-09-13 18:14:06 +02:00
Frederik Jaeckel
3796c7b7bc import: transfer buchungen korrigiert 2022-09-13 11:29:43 +02:00
Frederik Jaeckel
5544433b81 qif-import: ignoriert leere buchungen, prüft buchungstyp und kategorietyp 2022-09-12 18:52:22 +02:00
Frederik Jaeckel
e56b4f0cf8 import: für umbuchungen optimiert + test 2022-09-08 17:29:10 +02:00
Frederik Jaeckel
40ee9ed169 übersetzung 2022-09-08 12:53:48 +02:00
Frederik Jaeckel
63108a34eb transaktion: check für fehlende kategorie 2022-09-08 11:20:28 +02:00
Frederik Jaeckel
5216cecba7 Etikett ver 6.0.2 zum Änderungssatz 59e22aee60ef hinzugefügt 2022-09-05 10:22:29 +02:00
Frederik Jaeckel
491678da69 Version 6.0.2 2022-09-05 10:22:20 +02:00
Frederik Jaeckel
e9cde133c2 transaktionen: export + test 2022-09-05 10:13:20 +02:00
Frederik Jaeckel
8bb396f1d8 transaktion: import korrigiert 2022-09-03 20:36:16 +02:00
Frederik Jaeckel
78d02a60b7 import: party, transaction
übersetzung korrigiert
2022-09-02 14:33:12 +02:00
Frederik Jaeckel
a26e7119eb party: qif import 2022-09-01 17:13:55 +02:00
Frederik Jaeckel
be9c584fea import der transaktionen begonnen 2022-09-01 14:48:04 +02:00
Frederik Jaeckel
ac9400c085 kategorie: export als qif 2022-08-31 17:32:01 +02:00
Frederik Jaeckel
cdc0dfa49d Etikett ver 6.0.1 zum Änderungssatz 766463c8f9e1 hinzugefügt 2022-08-31 10:30:59 +02:00
Frederik Jaeckel
3eb4aebe0a Version 6.0.1 2022-08-31 10:30:49 +02:00
15 changed files with 348 additions and 427 deletions

View file

@ -9,11 +9,29 @@ pip install mds-cashbook-dataexchange
Requires
========
- Tryton 7.0
- Tryton 6.0
Changes
=======
*7.0.0 - 01.12.2023*
*6.0.4 - 14.02.2023*
- compatibility to Tryton 7.0
- fix: test
*6.0.3 - 13.09.2022*
- add: import of split-bookings
- updt: transfers
*6.0.2 - 05.09.2022*
- category: qif-export
- party, transactions: qif-import/export
*6.0.1 - 31.08.2022*
- add: qif - category - import
*6.0.0 - 28.08.2022*
- init

View file

@ -7,11 +7,9 @@ from trytond.pool import Pool
from .category import Category
from .book import Book
from .qiftool import QifTool
from .qif_import_wiz import (
ImportQifWizard, ImportQifWizardStart, ImportQifWizardInfo)
from .qif_import_wiz import ImportQifWizard, ImportQifWizardStart, ImportQifWizardInfo
from .qif_export import QifCategoryExport, QifBookExport
def register():
Pool.register(
QifTool,

View file

@ -3,6 +3,7 @@
# 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, PoolMeta
@ -27,13 +28,13 @@ class Book(metaclass=PoolMeta):
Book2 = pool.get('cashbook.book')
qif_content = QifTool.split_by_type(qifdata)
if 'Bank' not in qif_content.keys():
if not 'Bank' in qif_content.keys():
return None
(to_create, msg_list, fail_cnt) = \
QifTool.convert_transactions_to_create(
(to_create, msg_list, fail_cnt) = QifTool.convert_transactions_to_create(
book,
QifTool.qif_read_transactions(qif_content['Bank']))
QifTool.qif_read_transactions(qif_content['Bank'])
)
if fail_cnt == 0:
Book2.write(*[
[book],

View file

@ -3,6 +3,7 @@
# 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, PoolMeta
@ -17,9 +18,8 @@ class Category(metaclass=PoolMeta):
Category2 = pool.get('cashbook.category')
QifTool = pool.get('cashbook_dataexchange.qiftool')
categories = Category2.search(
[],
order=[('cattype', 'ASC'), ('rec_name', 'ASC')])
categories = Category2.search([],
order=[('cattype', 'ASC'), ('rec_name', 'ASC')])
export = ['!Type:Cat']
export.extend([QifTool.qif_export_category(x) for x in categories])
@ -34,7 +34,7 @@ class Category(metaclass=PoolMeta):
Category2 = pool.get('cashbook.category')
type_data = QifTool.split_by_type(qifdata)
if 'Cat' not in type_data.keys():
if not 'Cat' in type_data.keys():
return None
to_create = QifTool.convert_categories_to_create(

View file

@ -8,6 +8,7 @@ from trytond.pool import Pool
from slugify import slugify
class QifCategoryExport(Report):
__name__ = 'cashbook_dataexchange.rep_category'
@ -39,7 +40,7 @@ class QifBookExport(Report):
IrDate = pool.get('ir.date')
Book = pool.get('cashbook.book')
books = Book.search([('id', '=', data.get('id', -1))])
books = Book.search([('id', '=', data.get('id', -1))])
if len(books) == 1:
return (
'qif',
@ -50,7 +51,7 @@ class QifBookExport(Report):
'book': books[0].name,
}, max_length=100, word_boundary=True, save_order=True),
)
else:
else :
return (
'txt',
'not cashbook found',

View file

@ -7,26 +7,26 @@ 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.transaction import Transaction
from trytond.i18n import gettext
from trytond.pyson import Eval, Bool
from trytond.report import Report
from decimal import Decimal
class ImportQifWizardStart(ModelView):
'Import QIF-File'
__name__ = 'cashbook_dataexchange.qif_imp_wiz.start'
company = fields.Many2One(
model_name='company.company',
company = fields.Many2One(model_name='company.company',
string="Company", required=True,
states={'invisible': True})
book = fields.Many2One(
string='Cashbook', readonly=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,
'invisible': ~Bool(Eval('book')),
})
file_ = fields.Binary(string="QIF-File", required=True,
help='Quicken Interchange Format')
@classmethod
@ -40,15 +40,15 @@ 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',
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',
'invisible': ~Bool(Eval('book')),
})
allowimport = fields.Boolean(string='Import Enabled',
states={'invisible': True})
info = fields.Text(string='Information', readonly=True)
@ -60,23 +60,21 @@ class ImportQifWizard(Wizard):
__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',
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',
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)})])
Button(string='Import Data', state='importf', icon='tryton-import', default=True,
states={
'readonly': Eval('allowimport', False) == False,
}),
])
readf = StateTransition()
importf = StateTransition()
@ -88,7 +86,8 @@ class ImportQifWizard(Wizard):
values = {
'company': Transaction().context.get('company'),
'book': None}
'book': None,
}
model = context.get('active_model', '')
if model == 'cashbook.book':
@ -147,8 +146,7 @@ class ImportQifWizard(Wizard):
# 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']))
to_create = QifTool.convert_categories_to_create(QifTool.qif_read_categories(qif_content['Cat']))
in_categories = []
out_categories = []
@ -158,44 +156,43 @@ class ImportQifWizard(Wizard):
self.showinfo.info = gettext(
'cashbook_dataexchange.msg_wiz_categories_found',
categories='\n'.join(
categories = '\n'.join(
[''] +
['%s (in)' % x for x in in_categories] +
['%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')
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']))
QifTool.qif_read_transactions(qif_content['Bank'])
)
self.showinfo.info = gettext(
'cashbook_dataexchange.msg_wiz_parties_found',
numparties=len(to_create),
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')
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(
(to_create, msg_list, fail_cnt) = QifTool.convert_transactions_to_create(
self.start.book,
QifTool.qif_read_transactions(qif_content['Bank']))
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(gettext('cashbook_dataexchange.msg_wiz_transactions_error'))
info_lst.append('')
short_lst = []
@ -207,29 +204,22 @@ class ImportQifWizard(Wizard):
# 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']])
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)))
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'))
else :
info_lst.append(gettext('cashbook_dataexchange.msg_wiz_no_bank'))
self.showinfo.info = '\n'.join(info_lst)
return 'showinfo'
@ -251,13 +241,14 @@ class ImportQifWizard(Wizard):
if model == 'cashbook.category':
if file_content:
Category.create_from_qif(file_content)
records = 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')])
('state', '=', 'edit'),
])
if len(lines) > 0:
Line.wfcheck(lines)
elif model == 'party.party':
@ -270,3 +261,4 @@ class ImportQifWizard(Wizard):
return 'end'
# end ImportQifWizard

View file

@ -26,11 +26,11 @@ class QifTool(Model):
for line in lines:
if line.startswith('!Type:'):
current_type = line[len('!Type:'):].strip()
else:
else :
if current_type is None:
continue
if current_type not in blocks.keys():
if not current_type in blocks.keys():
blocks[current_type] = []
blocks[current_type].append(line.strip())
@ -82,8 +82,7 @@ class QifTool(Model):
for line in booktxt.strip().split('\n'):
line_txt = line[1:].strip()
if line.startswith('D'): # date
booking['date'] = datetime.strptime(
line_txt, '%d.%m.%Y').date()
booking['date'] = datetime.strptime(line_txt, '%d.%m.%Y').date()
elif line.startswith('T'): # total
booking['amount'] = cls.get_amount_from_txt(line_txt)
elif line.startswith('U'): # total
@ -104,26 +103,24 @@ class QifTool(Model):
elif line.startswith('L'): # category, account
if line_txt.startswith('[') and line_txt.endswith(']'):
booking['account'] = line_txt[1:-1]
else:
else :
booking['category'] = line_txt
elif line.startswith('S'): # split: category, account
if line_txt.startswith('[') and line_txt.endswith(']'):
booking['split'].append({
'account': line_txt[1:-1],
})
else:
else :
booking['split'].append({
'category': line_txt,
})
elif line.startswith('E'): # split: memo
booking['split'][-1]['description'] = line_txt
elif line.startswith('$'): # split: amount
booking['split'][-1]['amount'] = \
cls.get_amount_from_txt(line_txt)
booking['split'][-1]['amount'] = cls.get_amount_from_txt(line_txt)
elif line.startswith('£'): # split: amount
booking['split'][-1]['amount'] = \
cls.get_amount_from_txt(line_txt)
else:
booking['split'][-1]['amount'] = cls.get_amount_from_txt(line_txt)
else :
raise ValueError('unknown line-code: %s' % (line))
result.append(booking)
return result
@ -141,7 +138,7 @@ class QifTool(Model):
return amount
elif line.bookingtype in ['out', 'spout', 'mvout']:
return amount * Decimal('-1.0')
else:
else :
raise ValueError('invalid bookingtype: %s' % line.bookingtype)
for line in book.lines:
@ -151,10 +148,7 @@ class QifTool(Model):
})
# total
result.append('T%(total)s' % {
'total': Report.format_number(
get_amount_by_bookingstate(line.amount, line),
None,
digits=book.currency.digits),
'total': Report.format_number(get_amount_by_bookingstate(line.amount, line), None),
})
# state
result.append('C%(state)s' % {
@ -170,8 +164,8 @@ class QifTool(Model):
if p_address:
if len(p_address.full_address.strip()) > 0:
result.append('A%(address)s' % {
'address': p_address.full_address.replace(
'\n', ', ').strip()})
'address': p_address.full_address.replace('\n', ', ').strip(),
})
# category
if line.category:
result.append('L%(category)s' % {
@ -198,10 +192,7 @@ class QifTool(Model):
'memo': splitline.description.replace('\n', '; ')
})
result.append('$%(total)s' % {
'total': Report.format_number(
get_amount_by_bookingstate(splitline.amount, line),
None,
digits=book.currency.digits),
'total': Report.format_number(get_amount_by_bookingstate(splitline.amount, line), None),
})
result.append('^')
return '\n'.join(result)
@ -219,15 +210,17 @@ class QifTool(Model):
if len(parties) == 0:
msg_txt = gettext(
'cashbook_dataexchange.mds_import_party_notfound',
pname=partyname)
pname = partyname,
)
elif len(parties) == 1:
party_id = parties[0].id
else:
else :
party_id = parties[0].id
msg_txt = gettext(
'cashbook_dataexchange.mds_import_many_parties_found',
pname=partyname,
pname2=parties[0].rec_name)
pname = partyname,
pname2 = parties[0].rec_name,
)
return (party_id, msg_txt)
@classmethod
@ -248,13 +241,13 @@ class QifTool(Model):
elif len(books) == 0:
msg_txt = gettext(
'cashbook_dataexchange.mds_import_book_notfound',
bookname=account_name,
bookname = account_name,
)
else:
else :
msg_txt = gettext(
'cashbook_dataexchange.mds_import_many_books_found',
bookname1=account_name,
bookname2=books[0].rec_name,
bookname1 = account_name,
bookname2 = books[0].rec_name,
)
book_obj = books[0]
return (book_obj, msg_txt)
@ -276,13 +269,13 @@ class QifTool(Model):
elif len(categories) == 0:
msg_txt = gettext(
'cashbook_dataexchange.mds_import_category_notfound',
catname=catname,
catname = catname,
)
else:
else :
msg_txt = gettext(
'cashbook_dataexchange.mds_import_many_categories_found',
catname1=catname,
catname2='%(name)s [%(type)s]' % {
catname1 = catname,
catname2 = '%(name)s [%(type)s]' % {
'name': categories[0].rec_name,
'type': categories[0].cattype,
},
@ -301,13 +294,13 @@ class QifTool(Model):
"""
result = []
for catname in catdict.keys():
if do_search is True:
if do_search == True:
c_lst = Category.search([
('cattype', '=', ctype),
('name', '=', catname),
('parent', '=', None)
if parent is None else ('parent.id', '=', parent.id)])
else:
('cattype', '=', ctype),
('name', '=', catname),
('parent', '=', None) if parent is None else ('parent.id', '=', parent.id),
])
else :
c_lst = []
if len(c_lst) == 0:
@ -319,15 +312,13 @@ class QifTool(Model):
cat1['parent'] = parent.id
if len(catdict[catname]['childs']) > 0:
childs = get_create(
ctype, catdict[catname]['childs'], None, False)
childs = get_create(ctype, catdict[catname]['childs'], None, False)
if len(childs) > 0:
cat1['childs'] = [('create', childs)]
result.append(cat1)
else:
else :
if len(catdict[catname]['childs']) > 0:
result.extend(get_create(
ctype, catdict[catname]['childs'], c_lst[0], True))
result.extend(get_create(ctype, catdict[catname]['childs'], c_lst[0], True))
return result
to_create = []
for typ1 in ['in', 'out']:
@ -352,7 +343,8 @@ class QifTool(Model):
if Party.search_count([
('rec_name', 'ilike', '%%%(pname)s%%' % {
'pname': transaction['party'],
})]) == 0:
})
]) == 0:
to_create.append({
'name': transaction['party'],
'addresses': [('create', [{
@ -369,15 +361,15 @@ class QifTool(Model):
Line = Pool().get('cashbook.line')
if Line.search_count([
('cashbook.id', '=', book.id),
('booktransf.id', '=', line['booktransf']),
('date', '=', line['date']),
# ('description', '=', line['description']),
('amount', '=', line['amount']),
('bookingtype', '=', line['bookingtype']),
]) > 0:
('cashbook.id', '=', book.id),
('booktransf.id', '=', line['booktransf']),
('date', '=', line['date']),
#('description', '=', line['description']),
('amount', '=', line['amount']),
('bookingtype', '=', line['bookingtype']),
]) > 0:
return True
else:
else :
return False
@classmethod
@ -390,8 +382,7 @@ class QifTool(Model):
fail_cnt = 0
category = account = None
if cat_name is not None:
(category, msg_txt) = cls.get_category_by_name(
book.company, cat_name)
(category, msg_txt) = cls.get_category_by_name(book.company, cat_name)
if category is None:
msg_list.append(msg_txt)
fail_cnt += 1
@ -403,8 +394,7 @@ class QifTool(Model):
return (category, account, msg_list, fail_cnt)
@classmethod
def convert_transactions_to_create(
cls, book, transactions, split2edit=True):
def convert_transactions_to_create(cls, book, transactions, split2edit=True):
""" convert read transactions to create-command
split2edit: True = split-bookings are 'edit', False = dont change
"""
@ -419,16 +409,14 @@ class QifTool(Model):
msg_list = []
fail_cnt = 0
for transaction in transactions:
line = {
x: transaction[x]
for x in ['date', 'amount', 'description', 'state']
if x in transaction.keys()}
line = {x:transaction[x] for x in [
'date', 'amount', 'description', 'state',
] if x in transaction.keys()}
if 'description' in line.keys():
line['description'] = updt_description(line['description'])
(category, account, msg_lst2, fail_cnt2) = \
cls.get_category_account(book, transaction)
(category, account, msg_lst2, fail_cnt2) = cls.get_category_account(book, transaction)
msg_list.extend(msg_lst2)
if fail_cnt2 > 0:
fail_cnt += fail_cnt2
@ -453,7 +441,7 @@ class QifTool(Model):
if line['amount'] < Decimal('0.0'):
line['bookingtype'] = 'mvout'
line['amount'] = line['amount'].copy_negate()
else:
else :
line['bookingtype'] = 'mvin'
line['booktransf'] = account.id
@ -464,36 +452,34 @@ class QifTool(Model):
del transaction['party']
line['description'] = '; '.join(descr_lst)
line['state'] = 'edit'
if cls.check_counter_transaction(book, line) is True:
if cls.check_counter_transaction(book, line) == True:
# counter-transaction already exists
continue
else:
else :
# transaction: no category, no account - ignore?
if line.get('amount', Decimal('0.0')) == Decimal('0.0'):
# no amount --> ignore!
tr_info = {'trdate': '-', 'amount': '-'}
tr_info = {'trdate': '-', 'amount':'-'}
if 'date' in transaction.keys():
tr_info['trdate'] = Report.format_date(
transaction['date'], None)
tr_info['trdate'] = Report.format_date(transaction['date'], None)
if 'amount' in transaction.keys():
tr_info['amount'] = Report.format_currency(
tr_info['amount'] = Report.format_currency(
transaction['amount'],
None,
book.currency)
tr_info['descr'] = transaction.get('description', '-')
msg_list.append(gettext(
'cashbook_dataexchange.msg_ignore_null_booking',
trinfo='%(trdate)s, %(amount)s, %(descr)s' % tr_info,
trinfo = '%(trdate)s, %(amount)s, %(descr)s' % tr_info,
))
continue
# party
if 'party' in transaction.keys():
(party_id, msg_txt) = cls.get_party_by_name(
transaction['party'])
(party_id, msg_txt) = cls.get_party_by_name(transaction['party'])
if party_id is not None:
line['party'] = party_id
else:
else :
fail_cnt += 1
if msg_txt is not None:
msg_list.append(msg_txt)
@ -510,34 +496,28 @@ class QifTool(Model):
split_lines = []
for sp_line in transaction['split']:
(category, account, msg_lst2, fail_cnt2) = \
cls.get_category_account(book, sp_line)
(category, account, msg_lst2, fail_cnt2) = cls.get_category_account(book, sp_line)
msg_list.extend(msg_lst2)
if fail_cnt2 > 0:
fail_cnt += fail_cnt2
continue
split_line = {
'amount': sp_line['amount']
if line['bookingtype'].endswith('in')
else sp_line['amount'].copy_negate(),
'description': updt_description(
sp_line.get('description', None)),
'amount': sp_line['amount'] \
if line['bookingtype'].endswith('in') else sp_line['amount'].copy_negate(),
'description': updt_description(sp_line.get('description', None)),
}
if category:
# category match to bookingtype?
if ((category.cattype == 'in') and
line['bookingtype'].endswith('out')) or \
((category.cattype == 'out') and
line['bookingtype'].endswith('in')):
if ((category.cattype == 'in') and line['bookingtype'].endswith('out')) or\
((category.cattype == 'out') and line['bookingtype'].endswith('in')):
msg_list.append(gettext(
'cashbook_dataexchange.' +
'mds_import_category_not_match',
catname='%s [%s]' % (
category.rec_name, category.cattype),
bktype=line['bookingtype'],
data=str(transaction)))
'cashbook_dataexchange.mds_import_category_not_match',
catname = '%s [%s]' % (category.rec_name, category.cattype),
bktype = line['bookingtype'],
data = str(transaction),
))
fail_cnt += 1
continue
split_line['splittype'] = 'cat'
@ -545,7 +525,7 @@ class QifTool(Model):
elif account:
split_line['splittype'] = 'tr'
split_line['booktransf'] = account.id
else:
else :
continue
split_lines.append(split_line)
@ -553,7 +533,7 @@ class QifTool(Model):
if len(split_lines) > 0:
line['splitlines'] = [('create', split_lines)]
if split2edit is True:
if split2edit == True:
if 'splitlines' in line.keys():
line['state'] = 'edit'
@ -562,13 +542,13 @@ class QifTool(Model):
if line.get('category', None) is None:
msg_list.append(gettext(
'cashbook_dataexchange.mds_import_no_category',
trdata=str(transaction)))
trdata = str(transaction)))
fail_cnt += 1
elif line['bookingtype'] in ['mvin', 'mvout']:
if line.get('booktransf', None) is None:
msg_list.append(gettext(
'cashbook_dataexchange.mds_import_no_account',
trdata=str(transaction)))
trdata = str(transaction)))
fail_cnt += 1
to_create.append(line)
@ -613,10 +593,9 @@ class QifTool(Model):
cattype = 'out'
elif line.startswith('I'):
cattype = 'in'
else:
else :
raise ValueError('invalid line: %s (%s)' % (line, cattxt))
categories[cattype] = add_category(
categories[cattype], catname, cattype)
categories[cattype] = add_category(categories[cattype], catname, cattype)
return categories
@classmethod

View file

@ -2,7 +2,7 @@
"""
# Always prefer setuptools over distutils
from setuptools import setup
from setuptools import setup, find_packages
# To use a consistent encoding
from codecs import open
from os import path
@ -36,10 +36,10 @@ with open(path.join(here, 'versiondep.txt'), encoding='utf-8') as f:
l2 = i.strip().split(';')
if len(l2) < 4:
continue
modversion[l2[0]] = {'min': l2[1], 'max': l2[2], 'prefix': l2[3]}
modversion[l2[0]] = {'min':l2[1], 'max':l2[2], 'prefix':l2[3]}
# tryton-version
major_version = 7
major_version = 6
minor_version = 0
requires = ['python-slugify']
@ -51,21 +51,19 @@ for dep in info.get('depends', []):
prefix = modversion[dep]['prefix']
if len(modversion[dep]['max']) > 0:
requires.append('%s_%s >= %s, <= %s' % (
prefix, dep, modversion[dep]['min'],
modversion[dep]['max']))
else:
requires.append('%s_%s >= %s' % (
prefix, dep, modversion[dep]['min']))
else:
requires.append('%s_%s >= %s.%s, < %s.%s' % (
'trytond', dep, major_version, minor_version,
requires.append('%s_%s >= %s, <= %s' %
(prefix, dep, modversion[dep]['min'], modversion[dep]['max']))
else :
requires.append('%s_%s >= %s' %
(prefix, dep, modversion[dep]['min']))
else :
requires.append('%s_%s >= %s.%s, < %s.%s' %
('trytond', dep, major_version, minor_version,
major_version, minor_version + 1))
requires.append('trytond >= %s.%s, < %s.%s' % (
major_version, minor_version, major_version, minor_version + 1))
requires.append('trytond >= %s.%s, < %s.%s' %
(major_version, minor_version, major_version, minor_version + 1))
setup(
name='%s_%s' % (PREFIX, MODULE),
setup(name='%s_%s' % (PREFIX, MODULE),
version=info.get('version', '0.0.1'),
description='Tryton module to add import/export to cashbook.',
long_description=long_description,
@ -76,34 +74,35 @@ setup(
author_email='service@m-ds.de',
license='GPL-3',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
'Framework :: Tryton',
'Intended Audience :: Developers',
'Intended Audience :: Customer Service',
'Intended Audience :: Information Technology',
'Intended Audience :: Financial and Insurance Industry',
'Topic :: Office/Business',
'Topic :: Office/Business :: Financial :: Accounting',
'Natural Language :: German',
'Natural Language :: English',
'Operating System :: OS Independent',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
'Framework :: Tryton',
'Intended Audience :: Developers',
'Intended Audience :: Customer Service',
'Intended Audience :: Information Technology',
'Intended Audience :: Financial and Insurance Industry',
'Topic :: Office/Business',
'Topic :: Office/Business :: Financial :: Accounting',
'Natural Language :: German',
'Natural Language :: English',
'Operating System :: OS Independent',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
],
keywords='tryton cashbook import export',
package_dir={'trytond.modules.%s' % MODULE: '.'},
packages=[
'trytond.modules.%s' % MODULE,
],
package_data={
'trytond.modules.%s' % MODULE: (info.get('xml', []) + [
'tryton.cfg', 'locale/*.po', 'tests/*.py',
'report/*.fods', 'view/*.xml',
'versiondep.txt', 'README.rst']),
'trytond.modules.%s' % MODULE: (info.get('xml', [])
+ ['tryton.cfg', 'locale/*.po', 'tests/*.py',
'report/*.fods', 'view/*.xml',
'versiondep.txt', 'README.rst']),
},
install_requires=requires,
zip_safe=False,
entry_points="""

View file

@ -1,4 +1,27 @@
# -*- 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.
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import trytond.tests.test_tryton
import unittest
from trytond.modules.cashbook_dataexchange.tests.test_category import CategoryTestCase
from trytond.modules.cashbook_dataexchange.tests.test_party import PartyTestCase
from trytond.modules.cashbook_dataexchange.tests.test_transaction import TransactionTestCase
__all__ = ['suite']
class CashbookExchangeTestCase(\
CategoryTestCase,\
PartyTestCase,\
TransactionTestCase,\
):
'Test cashbook exchange module'
module = 'cashbook_dataexchange'
# end CashbookExchangeTestCase
def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CashbookExchangeTestCase))
return suite

View file

@ -5,13 +5,14 @@
from datetime import date
from decimal import Decimal
from trytond.tests.test_tryton import with_transaction
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool
from trytond.transaction import Transaction
from .qifdata import qif_types
from trytond.modules.cashbook.tests import CashbookTestCase
from .qifdata import qif_category, qif_types
class CategoryTestCase(object):
class CategoryTestCase(CashbookTestCase):
'Test cashbook categoy module'
module = 'cashbook_dataexchange'
@ -21,13 +22,13 @@ class CategoryTestCase(object):
"""
pool = Pool()
Category = pool.get('cashbook.category')
ImportWiz = pool.get(
'cashbook_dataexchange.qif_imp_wiz', type='wizard')
ImportWiz = pool.get('cashbook_dataexchange.qif_imp_wiz', type='wizard')
company = self.prep_company()
with Transaction().set_context({
'company': company.id,
'active_model': 'cashbook.category'}):
'company': company.id,
'active_model': 'cashbook.category',
}):
(sess_id, start_state, end_state) = ImportWiz.create()
w_obj = ImportWiz(sess_id)
self.assertEqual(start_state, 'start')
@ -48,9 +49,8 @@ class CategoryTestCase(object):
self.assertEqual(list(result.keys()), ['view'])
self.assertEqual(result['view']['defaults']['company'], company.id)
self.assertEqual(
result['view']['defaults']['info'],
"""The following categories are now imported:\n
self.assertEqual(result['view']['defaults']['info'],
"""The following categories are now imported:\n
Gehalt (in)
Gehalt/Zulagen (in)
@ -88,14 +88,10 @@ Lebensmittel (out)""")
self.assertEqual(records[8].rec_name, 'Telefon/Telco2-Handy')
self.assertEqual(records[9].rec_name, 'Telefon/Telco3')
self.assertEqual(records[10].rec_name, 'Telekommunikation')
self.assertEqual(
records[11].rec_name, 'Telekommunikation/Fernsehen')
self.assertEqual(
records[12].rec_name, 'Telekommunikation/Online-Dienste')
self.assertEqual(
records[13].rec_name, 'Telekommunikation/Telefon')
self.assertEqual(
records[14].rec_name, 'Telekommunikation/Telefon/Test1')
self.assertEqual(records[11].rec_name, 'Telekommunikation/Fernsehen')
self.assertEqual(records[12].rec_name, 'Telekommunikation/Online-Dienste')
self.assertEqual(records[13].rec_name, 'Telekommunikation/Telefon')
self.assertEqual(records[14].rec_name, 'Telekommunikation/Telefon/Test1')
@with_transaction()
def test_category_create_by_qif_emptydb(self):
@ -106,7 +102,8 @@ Lebensmittel (out)""")
company = self.prep_company()
with Transaction().set_context({
'company': company.id}):
'company': company.id,
}):
records = Category.create_from_qif(qif_types)
records = Category.search([], order=[('rec_name', 'ASC')])
@ -123,14 +120,10 @@ Lebensmittel (out)""")
self.assertEqual(records[8].rec_name, 'Telefon/Telco2-Handy')
self.assertEqual(records[9].rec_name, 'Telefon/Telco3')
self.assertEqual(records[10].rec_name, 'Telekommunikation')
self.assertEqual(
records[11].rec_name, 'Telekommunikation/Fernsehen')
self.assertEqual(
records[12].rec_name, 'Telekommunikation/Online-Dienste')
self.assertEqual(
records[13].rec_name, 'Telekommunikation/Telefon')
self.assertEqual(
records[14].rec_name, 'Telekommunikation/Telefon/Test1')
self.assertEqual(records[11].rec_name, 'Telekommunikation/Fernsehen')
self.assertEqual(records[12].rec_name, 'Telekommunikation/Online-Dienste')
self.assertEqual(records[13].rec_name, 'Telekommunikation/Telefon')
self.assertEqual(records[14].rec_name, 'Telekommunikation/Telefon/Test1')
result = Category.export_as_qif()
self.assertEqual(result, """!Type:Cat
@ -190,7 +183,8 @@ I
company = self.prep_company()
with Transaction().set_context({
'company': company.id}):
'company': company.id,
}):
cat1, = Category.create([{
'name': 'Telekommunikation',
'cattype': 'out',
@ -205,7 +199,7 @@ I
self.assertEqual(records[0].rec_name, 'Telekommunikation')
self.assertEqual(records[1].rec_name, 'Telekommunikation/Telefon')
Category.create_from_qif(qif_types)
records1 = Category.create_from_qif(qif_types)
records = Category.search([], order=[('rec_name', 'ASC')])
self.assertEqual(len(records), 15)
@ -221,14 +215,10 @@ I
self.assertEqual(records[8].rec_name, 'Telefon/Telco2-Handy')
self.assertEqual(records[9].rec_name, 'Telefon/Telco3')
self.assertEqual(records[10].rec_name, 'Telekommunikation')
self.assertEqual(
records[11].rec_name, 'Telekommunikation/Fernsehen')
self.assertEqual(
records[12].rec_name, 'Telekommunikation/Online-Dienste')
self.assertEqual(
records[13].rec_name, 'Telekommunikation/Telefon')
self.assertEqual(
records[14].rec_name, 'Telekommunikation/Telefon/Test1')
self.assertEqual(records[11].rec_name, 'Telekommunikation/Fernsehen')
self.assertEqual(records[12].rec_name, 'Telekommunikation/Online-Dienste')
self.assertEqual(records[13].rec_name, 'Telekommunikation/Telefon')
self.assertEqual(records[14].rec_name, 'Telekommunikation/Telefon/Test1')
@with_transaction()
def test_qiftool_split_types(self):
@ -238,25 +228,18 @@ I
result = QifTool.split_by_type(qif_types)
self.assertEqual(len(result.keys()), 2)
self.assertEqual(
result['Cat'],
'NGehalt\nI\n^\nNGehalt:Zulagen\nI\n^\nNTelekommunikation' +
'\nE\n^\nNTelekommunikation:Online-Dienste\n' +
'E\n^\nNTelekommunikation:Telefon\nE\n^\nN' +
'Telekommunikation:Telefon:Test1\n' +
'E\n^\nNTelefon:Telco1-Tablett\n' +
'E\n^\nNTelefon:Telco2-Handy\nE\n^\nNTelefon:Telco3\nE\n^\n' +
'NTelekommunikation:Fernsehen\nE\n^\nNFernsehen:TV-Company\nE\n' +
self.assertEqual(result['Cat'], 'NGehalt\nI\n^\nNGehalt:Zulagen\n'+
'I\n^\nNTelekommunikation\nE\n^\nNTelekommunikation:Online-Dienste\n'+
'E\n^\nNTelekommunikation:Telefon\nE\n^\nNTelekommunikation:Telefon:Test1\n'+
'E\n^\nNTelefon:Telco1-Tablett\n'+
'E\n^\nNTelefon:Telco2-Handy\nE\n^\nNTelefon:Telco3\nE\n^\n'+
'NTelekommunikation:Fernsehen\nE\n^\nNFernsehen:TV-Company\nE\n'+
'^\nNFernsehen:GEZ\nE\n^\nNLebensmittel\nE\n^')
self.assertEqual(
result['Bank'],
'D04.12.2013\nT7,12\nCX\n' +
'POpening Balance\nL[Bargeld]\n^\nD05.12.2013\nCX\nM05.12/' +
'06.42UHR TT TELTOW\nT-29,00\n' +
'PGA NR00002168 BLZ10000000 0\nL[S-Giro]\n^\nD05.12.2013' +
'\nCX\nMsome food\nT-56,37\nPFoodshop Zehlendorf\n' +
'LLebensmittel\n^\nD06.12.2013\nCX\nMreturn of bottles\n' +
'T1,45\nPFoodshop Zehlendorf\nLLebensmittel\n^\n')
self.assertEqual(result['Bank'], 'D04.12.2013\nT7,12\nCX\nPOpening Balance\n'+
'L[Bargeld]\n^\nD05.12.2013\nCX\nM05.12/06.42UHR TT TELTOW\nT-29,00\n'+
'PGA NR00002168 BLZ10000000 0\nL[S-Giro]\n^\nD05.12.2013\nCX\nMsome food\n'+
'T-56,37\nPFoodshop Zehlendorf\nLLebensmittel\n^\nD06.12.2013\nCX\n'+
'Mreturn of bottles\nT1,45\nPFoodshop Zehlendorf\nLLebensmittel\n^\n')
@with_transaction()
def test_qiftool_convert_transactions(self):
@ -270,7 +253,8 @@ I
company = self.prep_company()
with Transaction().set_context({
'company': company.id}):
'company': company.id,
}):
types = self.prep_type()
books = Book.create([{
'name': 'Cash Book',
@ -329,21 +313,17 @@ I
'company': company.id,
}])
tr_list = QifTool.qif_read_transactions(
'D04.12.2013\nT7,12\nCX\n' +
'POpening Balance\nL[Bargeld]\n^\nD05.12.2013\nCX\n' +
'M05.12/06.42UHR TT TELTOW\nT-29,00\nPGA NR00002168 ' +
'BLZ10000000 0\n' +
'L[S-Giro]\n^\nD05.12.2013\nCX\nMsome food\nT-56,37\n' +
'PFoodshop Zehlendorf\nLLebensmittel\n^\nD22.10.2020\n' +
'CX\nMLebensmittel\nT-55,84\nPreal,- Teltow\nLLebensmittel\n' +
'SLebensmittel\nELebensmittel\n$-49,36\nSKosmetik\n' +
'EKlopapier\n' +
'$-2,99\nSHaushaltschemie\nESagrotan\n$-3,49\n' +
tr_list = QifTool.qif_read_transactions('D04.12.2013\nT7,12\nCX\n'+
'POpening Balance\nL[Bargeld]\n^\nD05.12.2013\nCX\n'+
'M05.12/06.42UHR TT TELTOW\nT-29,00\nPGA NR00002168 BLZ10000000 0\n'+
'L[S-Giro]\n^\nD05.12.2013\nCX\nMsome food\nT-56,37\n'+
'PFoodshop Zehlendorf\nLLebensmittel\n^\nD22.10.2020\n'+
'CX\nMLebensmittel\nT-55,84\nPreal,- Teltow\nLLebensmittel\n'+
'SLebensmittel\nELebensmittel\n$-49,36\nSKosmetik\nEKlopapier\n'+
'$-2,99\nSHaushaltschemie\nESagrotan\n$-3,49\n'+
'S[S-Giro]\nEtransfer out\n$-3,49\n^\n')
(to_create, msg_txt, fail_cnt) = \
QifTool.convert_transactions_to_create(books[0], tr_list)
(to_create, msg_txt, fail_cnt) = QifTool.convert_transactions_to_create(books[0], tr_list)
self.assertEqual(msg_txt, [])
self.assertEqual(to_create, [{
'date': date(2013, 12, 4),
@ -355,12 +335,11 @@ I
}, {
'date': date(2013, 12, 5),
'amount': Decimal('29.00'),
'description': '05.12/06.42UHR TT TELTOW',
'state': 'edit',
'bookingtype': 'mvout',
'booktransf': books[1].id,
'description':
'GA NR00002168 BLZ10000000 0; 05.12/06.42UHR ' +
'TT TELTOW',
'description': 'GA NR00002168 BLZ10000000 0; 05.12/06.42UHR TT TELTOW',
}, {
'date': date(2013, 12, 5),
'amount': Decimal('56.37'),
@ -398,7 +377,8 @@ I
'amount': Decimal('3.49'),
'description': 'transfer out',
'booktransf': books[1].id,
}])],
}],
)],
}])
Book.write(*[
[books[0]],
@ -414,15 +394,13 @@ I
"""
QifTool = Pool().get('cashbook_dataexchange.qiftool')
result = QifTool.qif_read_transactions(
'D04.12.2013\nT7,12\nCX\n' +
'POpening Balance\nL[Bargeld]\n^\nD05.12.2013\nCX\n' +
'M05.12/06.42UHR TT TELTOW\nT290,00\nPGA ' +
'NR00002168 BLZ10000000 0\n' +
'L[S-Giro]\n^\nD05.12.2013\nCX\nMsome food\nT-56,37\n' +
'PFoodshop Zehlendorf\nLLebensmittel\n^\nD22.10.2020\n' +
'CX\nMLebensmittel\nT-55,84\nPreal,- Teltow\nLLebensmittel\n' +
'SLebensmittel\nELebensmittel\n$-49,36\nSKosmetik\nEKlopapier\n' +
result = QifTool.qif_read_transactions('D04.12.2013\nT7,12\nCX\n'+
'POpening Balance\nL[Bargeld]\n^\nD05.12.2013\nCX\n'+
'M05.12/06.42UHR TT TELTOW\nT290,00\nPGA NR00002168 BLZ10000000 0\n'+
'L[S-Giro]\n^\nD05.12.2013\nCX\nMsome food\nT-56,37\n'+
'PFoodshop Zehlendorf\nLLebensmittel\n^\nD22.10.2020\n'+
'CX\nMLebensmittel\nT-55,84\nPreal,- Teltow\nLLebensmittel\n'+
'SLebensmittel\nELebensmittel\n$-49,36\nSKosmetik\nEKlopapier\n'+
'$-2,99\nSHaushaltschemie\nESagrotan\n$-3,49\n^\n')
self.assertEqual(result, [{
'split': [],
@ -475,10 +453,8 @@ I
"""
QifTool = Pool().get('cashbook_dataexchange.qiftool')
result = QifTool.qif_read_categories(
'NGehalt\nI\n^\nNGehalt:Zulagen\nI\n^' +
'NTelekommunikation\nE\n^\nNTelekommunikation:' +
'Online-Dienste\nE\n^')
result = QifTool.qif_read_categories('NGehalt\nI\n^\nNGehalt:Zulagen\nI\n^'+
'NTelekommunikation\nE\n^\nNTelekommunikation:Online-Dienste\nE\n^')
self.assertEqual(result, {
'in': {
'Gehalt': {

View file

@ -1,24 +0,0 @@
# -*- 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.modules.cashbook.tests.test_module import CashbookTestCase
from .category import CategoryTestCase
from .party import PartyTestCase
from .transaction import TransactionTestCase
class CashbookExchangeTestCase(
CashbookTestCase,
CategoryTestCase,
PartyTestCase,
TransactionTestCase):
'Test cashbook exchange module'
module = 'cashbook_dataexchange'
# end CashbookExchangeTestCase
del CashbookTestCase

View file

@ -3,13 +3,15 @@
# The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms.
from trytond.tests.test_tryton import with_transaction
from datetime import date
from decimal import Decimal
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool
from trytond.transaction import Transaction
from .qifdata import qif_types
class PartyTestCase(object):
class PartyTestCase(ModuleTestCase):
'Test cashbook party module'
module = 'cashbook_dataexchange'
@ -19,13 +21,13 @@ class PartyTestCase(object):
"""
pool = Pool()
Party = pool.get('party.party')
ImportWiz = pool.get(
'cashbook_dataexchange.qif_imp_wiz', type='wizard')
ImportWiz = pool.get('cashbook_dataexchange.qif_imp_wiz', type='wizard')
company = self.prep_company()
with Transaction().set_context({
'company': company.id,
'active_model': 'party.party'}):
'company': company.id,
'active_model': 'party.party',
}):
(sess_id, start_state, end_state) = ImportWiz.create()
w_obj = ImportWiz(sess_id)
self.assertEqual(start_state, 'start')
@ -46,9 +48,8 @@ class PartyTestCase(object):
self.assertEqual(list(result.keys()), ['view'])
self.assertEqual(result['view']['defaults']['company'], company.id)
self.assertEqual(
result['view']['defaults']['info'],
"""The following 3 parties are now imported:\n
self.assertEqual(result['view']['defaults']['info'],
"""The following 3 parties are now imported:\n
Opening Balance
GA NR00002168 BLZ10000000 0
Foodshop Zehlendorf""")
@ -63,8 +64,7 @@ Foodshop Zehlendorf""")
self.assertEqual(len(records), 4)
self.assertEqual(records[0].rec_name, 'Foodshop Zehlendorf')
self.assertEqual(
records[1].rec_name, 'GA NR00002168 BLZ10000000 0')
self.assertEqual(records[1].rec_name, 'GA NR00002168 BLZ10000000 0')
self.assertEqual(records[2].rec_name, 'm-ds')
self.assertEqual(records[3].rec_name, 'Opening Balance')

View file

@ -5,13 +5,13 @@
from datetime import date
from decimal import Decimal
from trytond.tests.test_tryton import with_transaction
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool
from trytond.transaction import Transaction
from .qifdata import qif_types
class TransactionTestCase(object):
class TransactionTestCase(ModuleTestCase):
'Test cashbook transaction module'
module = 'cashbook_dataexchange'
@ -26,7 +26,8 @@ class TransactionTestCase(object):
company = self.prep_company()
with Transaction().set_context({
'company': company.id}):
'company': company.id,
}):
types = self.prep_type()
books = Book.create([{
'name': 'Cash Book',
@ -49,24 +50,21 @@ class TransactionTestCase(object):
{
'lines': [('create', [{
'date': date(2022, 6, 1),
'bookingtype': 'mvout',
'bookingtype':'mvout',
'amount': Decimal('10.0'),
'booktransf': books[1].id,
'description': 'transfer',
}])],
}])
self.assertEqual(len(books[0].lines), 1)
self.assertEqual(
books[0].lines[0].rec_name,
self.assertEqual(books[0].lines[0].rec_name,
'06/01/2022|to|-10.00 usd|transfer [S-Giro | 0.00 usd | Open]')
self.assertEqual(len(books[1].lines), 0)
Line.wfcheck(books[0].lines)
self.assertEqual(len(books[1].lines), 1)
self.assertEqual(
books[1].lines[0].rec_name,
'06/01/2022|from|10.00 usd|transfer [Cash Book ' +
'| -10.00 usd | Open]')
self.assertEqual(books[1].lines[0].rec_name,
'06/01/2022|from|10.00 usd|transfer [Cash Book | -10.00 usd | Open]')
self.assertEqual(QifTool.check_counter_transaction(books[1], {
'booktransf': books[0].id,
@ -84,13 +82,13 @@ class TransactionTestCase(object):
Party = pool.get('party.party')
Category = pool.get('cashbook.category')
Book = pool.get('cashbook.book')
ImportWiz = pool.get(
'cashbook_dataexchange.qif_imp_wiz', type='wizard')
ImportWiz = pool.get('cashbook_dataexchange.qif_imp_wiz', type='wizard')
company = self.prep_company()
with Transaction().set_context({
'company': company.id,
'active_model': 'cashbook.book'}):
'company': company.id,
'active_model': 'cashbook.book',
}):
types = self.prep_type()
books = Book.create([{
'name': 'Cash Book',
@ -117,13 +115,13 @@ class TransactionTestCase(object):
Party.create([{
'name': 'GA NR00002168 BLZ10000000 0',
'addresses': [('create', [{}])],
'addresses':[('create', [{}])],
}, {
'name': 'Foodshop Zehlendorf',
'addresses': [('create', [{}])],
'addresses':[('create', [{}])],
}, {
'name': 'Opening Balance',
'addresses': [('create', [{}])],
'addresses':[('create', [{}])],
}])
Category.create([{
@ -153,9 +151,8 @@ class TransactionTestCase(object):
self.assertEqual(list(result.keys()), ['view'])
self.assertEqual(result['view']['defaults']['company'], company.id)
self.assertEqual(
result['view']['defaults']['info'],
"""The following transactionen are now imported:
self.assertEqual(result['view']['defaults']['info'],
"""The following transactionen are now imported:
Credit: usd7.12
Debit: usd83.92
Balance: -usd76.80
@ -172,20 +169,10 @@ Number of transactions: 4""")
self.assertEqual(len(books[0].lines), 4)
self.assertEqual(
books[0].lines[0].rec_name,
'12/04/2013|from|7.12 usd|Opening Balance ' +
'[Bargeld | -7.12 usd | Open]')
self.assertEqual(
books[0].lines[1].rec_name,
'12/05/2013|to|-29.00 usd|GA NR00002168 BLZ10000000 ' +
'0; 05.12/06.42 [S-Giro | 29.00 usd | Open]')
self.assertEqual(
books[0].lines[2].rec_name,
'12/05/2013|Exp|-56.37 usd|some food [Lebensmittel]')
self.assertEqual(
books[0].lines[3].rec_name,
'12/06/2013|Exp|1.45 usd|return of bottles [Lebensmittel]')
self.assertEqual(books[0].lines[0].rec_name, '12/04/2013|from|7.12 usd|Opening Balance [Bargeld | -7.12 usd | Open]')
self.assertEqual(books[0].lines[1].rec_name, '12/05/2013|to|-29.00 usd|GA NR00002168 BLZ10000000 0; 05.12/06.42 [S-Giro | 29.00 usd | Open]')
self.assertEqual(books[0].lines[2].rec_name, '12/05/2013|Exp|-56.37 usd|some food [Lebensmittel]')
self.assertEqual(books[0].lines[3].rec_name, '12/06/2013|Exp|1.45 usd|return of bottles [Lebensmittel]')
self.assertEqual(Book.export_as_qif(books[0]), """!Type:Bank
D12/04/2013
@ -224,13 +211,13 @@ Mreturn of bottles
Party = pool.get('party.party')
Category = pool.get('cashbook.category')
Book = pool.get('cashbook.book')
ImportWiz = pool.get(
'cashbook_dataexchange.qif_imp_wiz', type='wizard')
ImportWiz = pool.get('cashbook_dataexchange.qif_imp_wiz', type='wizard')
company = self.prep_company()
with Transaction().set_context({
'company': company.id,
'active_model': 'cashbook.book'}):
'company': company.id,
'active_model': 'cashbook.book',
}):
types = self.prep_type()
books = Book.create([{
'name': 'From Book',
@ -250,7 +237,7 @@ Mreturn of bottles
Party.create([{
'name': 'Foodshop Zehlendorf',
'addresses': [('create', [{}])],
'addresses':[('create', [{}])],
}])
Category.create([{
@ -296,9 +283,8 @@ L[To Book]
self.assertEqual(list(result.keys()), ['view'])
self.assertEqual(result['view']['defaults']['company'], company.id)
self.assertEqual(
result['view']['defaults']['info'],
"""The following transactionen are now imported:
self.assertEqual(result['view']['defaults']['info'],
"""The following transactionen are now imported:
Credit: usd0.00
Debit: usd57.55
Balance: -usd57.55
@ -316,19 +302,11 @@ Number of transactions: 2""")
self.assertEqual(len(books[0].lines), 2)
self.assertEqual(len(books[1].lines), 1)
self.assertEqual(
books[0].lines[0].rec_name,
'12/04/2013|to|-7.30 usd|Transfer to book ' +
'[To Book | 7.30 usd | Open]')
self.assertEqual(books[0].lines[0].rec_name, '12/04/2013|to|-7.30 usd|Transfer to book [To Book | 7.30 usd | Open]')
self.assertEqual(books[0].lines[0].state, 'check')
self.assertEqual(
books[0].lines[1].rec_name,
'12/05/2013|Exp|-50.25 usd|some food [Lebensmittel]')
self.assertEqual(books[0].lines[1].rec_name, '12/05/2013|Exp|-50.25 usd|some food [Lebensmittel]')
self.assertEqual(books[0].lines[1].state, 'check')
self.assertEqual(
books[1].lines[0].rec_name,
'12/04/2013|from|7.30 usd|Transfer to book ' +
'[From Book | -57.55 usd | Open]')
self.assertEqual(books[1].lines[0].rec_name, '12/04/2013|from|7.30 usd|Transfer to book [From Book | -57.55 usd | Open]')
self.assertEqual(books[1].lines[0].state, 'check')
# run wizard again - import to 'To Book'
@ -381,9 +359,8 @@ $-7,00
self.assertEqual(list(result.keys()), ['view'])
self.assertEqual(result['view']['defaults']['company'], company.id)
self.assertEqual(
result['view']['defaults']['info'],
"""The following transactionen are now imported:
self.assertEqual(result['view']['defaults']['info'],
"""The following transactionen are now imported:
Credit: usd0.00
Debit: usd20.00
Balance: -usd20.00
@ -401,37 +378,18 @@ Number of transactions: 2""")
self.assertEqual(len(books[0].lines), 3)
self.assertEqual(len(books[1].lines), 3)
self.assertEqual(
books[0].lines[0].rec_name,
'12/04/2013|to|-7.30 usd|Transfer to book ' +
'[To Book | -12.70 usd | Open]')
self.assertEqual(
books[0].lines[0].state, 'check')
self.assertEqual(
books[0].lines[1].rec_name,
'12/05/2013|Exp|-50.25 usd|some food [Lebensmittel]')
self.assertEqual(
books[0].lines[1].state, 'check')
self.assertEqual(
books[0].lines[2].rec_name,
'12/06/2013|from|7.00 usd|Transfer to From-Book ' +
'[To Book | -12.70 usd | Open]')
self.assertEqual(
books[0].lines[2].state, 'check')
self.assertEqual(books[0].lines[0].rec_name, '12/04/2013|to|-7.30 usd|Transfer to book [To Book | -12.70 usd | Open]')
self.assertEqual(books[0].lines[0].state, 'check')
self.assertEqual(books[0].lines[1].rec_name, '12/05/2013|Exp|-50.25 usd|some food [Lebensmittel]')
self.assertEqual(books[0].lines[1].state, 'check')
self.assertEqual(books[0].lines[2].rec_name, '12/06/2013|from|7.00 usd|Transfer to From-Book [To Book | -12.70 usd | Open]')
self.assertEqual(books[0].lines[2].state, 'check')
self.assertEqual(
books[1].lines[0].rec_name,
'12/04/2013|from|7.30 usd|Transfer to book [From Book ' +
'| -50.55 usd | Open]')
self.assertEqual(books[1].lines[0].rec_name, '12/04/2013|from|7.30 usd|Transfer to book [From Book | -50.55 usd | Open]')
self.assertEqual(books[1].lines[0].state, 'check')
self.assertEqual(
books[1].lines[1].rec_name,
'12/06/2013|Exp/Sp|-10.00 usd|Splitbooking with category' +
' and account [-]')
self.assertEqual(books[1].lines[1].rec_name, '12/06/2013|Exp/Sp|-10.00 usd|Splitbooking with category and account [-]')
self.assertEqual(books[1].lines[1].state, 'check')
self.assertEqual(
books[1].lines[2].rec_name,
'12/10/2013|Exp|-10.00 usd|some food [Lebensmittel]')
self.assertEqual(books[1].lines[2].rec_name, '12/10/2013|Exp|-10.00 usd|some food [Lebensmittel]')
self.assertEqual(books[1].lines[2].state, 'check')
# end PartyTestCase

View file

@ -1,5 +1,5 @@
[tryton]
version=7.0.0
version=6.0.4
depends:
cashbook
xml:

View file

@ -1 +1 @@
cashbook;7.0.31;7.0.999;mds
cashbook;6.0.25;6.0.999;mds