Multiple Data Sources in Evaluations

This commit is contained in:
Frederik Jaeckel 2024-01-13 15:08:20 +01:00
parent 85e7b0c821
commit 0e8ff2849b
13 changed files with 952 additions and 383 deletions

View file

@ -3,14 +3,17 @@
# The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms.
from sql.conditionals import Case
from trytond.model import ModelView, ModelSQL, fields, sequence_ordered
from trytond.pyson import Eval
from trytond.pyson import Eval, Bool
from trytond.transaction import Transaction
from trytond.pool import Pool
from trytond.i18n import gettext
from trytond.exceptions import UserError
from .colors import sel_color as sel_bgcolor
from .templates import template_view_graph, template_view_line, \
cashbook_types, category_types, booktype_types
from .templates import (
template_view_graph, template_view_line, cashbook_types,
category_types, booktype_types, currency_types)
sel_chart = [
@ -39,10 +42,41 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
string='Company', model_name='company.company',
required=True, ondelete="RESTRICT")
name = fields.Char(string='Name', required=True)
dtype = fields.Selection(
string='Data type', required=True, sort=True,
# max. 5x data tyypes to show
dtype1 = fields.Selection(
string='Data type 1', required=True, sort=True,
selection='get_sel_etype', help='Type of data displayed')
dtype_string = dtype.translated('dtype')
dtype1_string = dtype1.translated('dtype1')
dtype2 = fields.Selection(
string='Data type 2', sort=True,
selection='get_sel_etype2', help='Type of data displayed',
states={
'invisible': ~Bool(Eval('dtype1', '')),
}, depends=['dtype1'])
dtype2_string = dtype2.translated('dtype2')
dtype3 = fields.Selection(
string='Data type 3', sort=True,
selection='get_sel_etype2', help='Type of data displayed',
states={
'invisible': ~Bool(Eval('dtype2', '')),
}, depends=['dtype2'])
dtype3_string = dtype3.translated('dtype3')
dtype4 = fields.Selection(
string='Data type 4', sort=True,
selection='get_sel_etype2', help='Type of data displayed',
states={
'invisible': ~Bool(Eval('dtype3', '')),
}, depends=['dtype3'])
dtype4_string = dtype4.translated('dtype4')
dtype5 = fields.Selection(
string='Data type 5', sort=True,
selection='get_sel_etype2', help='Type of data displayed',
states={
'invisible': ~Bool(Eval('dtype4', '')),
}, depends=['dtype4'])
dtype5_string = dtype5.translated('dtype5')
chart = fields.Selection(
string='Chart type', required=True, sort=False,
selection=sel_chart, help='Type of graphical presentation.')
@ -62,24 +96,24 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
cashbooks = fields.Many2Many(
string='Cashbooks', relation_name='cashbook_report.eval_line',
origin='evaluation', target='cashbook',
states={'invisible': ~Eval('dtype', '').in_(cashbook_types)},
depends=['dtype'])
states={'invisible': ~Eval('dtype1', '').in_(cashbook_types)},
depends=['dtype1'])
types = fields.Many2Many(
string='Types', relation_name='cashbook_report.eval_line',
origin='evaluation', target='dtype',
states={'invisible': ~Eval('dtype', '').in_(booktype_types)},
depends=['dtype'])
states={'invisible': ~Eval('dtype1', '').in_(booktype_types)},
depends=['dtype1'])
currencies = fields.Many2Many(
string='Currencies', relation_name='cashbook_report.eval_line',
origin='evaluation', target='currency',
filter=[('cashbook_hasbookings', '=', True)],
states={'invisible': Eval('dtype', '') != 'currencies'},
depends=['dtype'])
states={'invisible': Eval('dtype1', '') != 'currencies'},
depends=['dtype1'])
categories = fields.Many2Many(
string='Categories', relation_name='cashbook_report.eval_line',
origin='evaluation', target='category',
states={'invisible': ~Eval('dtype', '').in_(category_types)},
depends=['dtype'])
states={'invisible': ~Eval('dtype1', '').in_(category_types)},
depends=['dtype1'])
line_values = fields.One2Many(
string='Line Values', field='evaluation', readonly=True,
@ -94,6 +128,32 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
string='Dashboard View', model_name='ir.action.act_window.view',
ondelete='SET NULL')
@classmethod
def __register__(cls, module_name):
super(Evaluation, cls).__register__(module_name)
table = cls.__table_handler__(module_name)
tav_eval = cls.__table__()
cursor = Transaction().connection.cursor()
# x.0.9 --> x.0.10
if table.column_exist('dtype'):
query = tav_eval.update(
columns=[tav_eval.dtype1],
values=[Case(
(tav_eval.dtype == 'category_gldiff',
'categories_gldiff'),
(tav_eval.dtype == 'category_glvalue',
'categories_glvalue'),
(tav_eval.dtype == 'category_glperc',
'categories_glperc'),
(tav_eval.dtype == 'category_glyield',
'categories_glyield'),
else_=tav_eval.dtype)
])
cursor.execute(*query)
table.drop_column('dtype')
@classmethod
def default_currency(cls):
""" currency of company
@ -129,11 +189,94 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
return True
@classmethod
def default_dtype(cls):
def default_dtype1(cls):
""" default 'book'
"""
return 'cashbooks'
@classmethod
def default_dtype2(cls):
""" default None
"""
return None
@classmethod
def default_dtype3(cls):
""" default None
"""
return None
@classmethod
def default_dtype4(cls):
""" default None
"""
return None
@classmethod
def default_dtype5(cls):
""" default None
"""
return None
@fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5')
def on_change_dtype1(self):
""" update other dtype-fields
"""
self.get_onchange_dtypes()
@fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5')
def on_change_dtype2(self):
""" update other dtype-fields
"""
self.get_onchange_dtypes()
@fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5')
def on_change_dtype3(self):
""" update other dtype-fields
"""
self.get_onchange_dtypes()
@fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5')
def on_change_dtype4(self):
""" update other dtype-fields
"""
self.get_onchange_dtypes()
@fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5')
def on_change_dtype5(self):
""" update other dtype-fields
"""
self.get_onchange_dtypes()
def get_onchange_dtypes(self):
""" update other dtype-fields
"""
dtypes = [x[0] for x in self.get_sel_etype2()]
if not self.dtype1:
self.dtype2 = None
if self.dtype2 and (self.dtype2 not in dtypes):
self.dtype2 = None
if not self.dtype2:
self.dtype3 = None
if self.dtype3 and (self.dtype3 not in dtypes):
self.dtype3 = None
if not self.dtype3:
self.dtype4 = None
if self.dtype4 and (self.dtype4 not in dtypes):
self.dtype4 = None
if not self.dtype4:
self.dtype5 = None
if self.dtype5 and (self.dtype5 not in dtypes):
self.dtype5 = None
@classmethod
def default_chart(cls):
""" default 'pie'
@ -144,18 +287,42 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
def get_sel_etype(cls):
""" get list of evaluation-types
"""
return [
('cashbooks', gettext('cashbook_report.msg_dtype_cashbook')),
('types', gettext('cashbook_report.msg_dtype_type')),
('currencies', gettext('cashbook_report.msg_dtype_currency')),
('categories', gettext('cashbook_report.msg_dtype_category')),
]
result = [('', '-/-')]
result.extend([
(x, gettext('cashbook_report.msg_dtype_%s' % x))
for x in ['cashbooks', 'types', 'currencies', 'categories']])
return result
@fields.depends('dtype1')
def get_sel_etype2(self):
""" get list of allowed evaluation-types for dtype2
"""
Eval2 = Pool().get('cashbook_report.evaluation')
result = [('', '-/-')]
dtype1 = getattr(self, 'dtype1', None)
if not dtype1:
return result
dtype = dtype1.split('_')[0]
result.extend([
x
for x in Eval2.get_sel_etype()
if x[0].startswith(dtype)])
return result
@classmethod
def get_create_view_data(cls, evaluation):
""" generate dictionary to create view-xml
"""
return {
dtypes = [{
'name': getattr(evaluation, 'dtype%d_string' % x),
'fname': 'value%d' % x}
for x in range(1, 6)
if getattr(evaluation, 'dtype%d' % x, None) is not None]
result = {
'model': 'cashbook_report.eval_line',
'module': 'cashbook_report',
'priority': 10,
@ -167,9 +334,13 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
'type': evaluation.chart,
'colscheme': '' if evaluation.maincolor == 'default'
else 'color="%s"' % evaluation.maincolor,
'lines': template_view_line % {
'fill': '1',
'string': evaluation.dtype_string}}}
'lines': '\n'.join([
template_view_line % {
'fill': '1',
'fname': x['fname'],
'string': x['name']}
for x in dtypes])}}
return result
@classmethod
def uiview_delete(cls, evaluations):
@ -221,7 +392,8 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
'name': evaluation.name,
'res_model': 'cashbook_report.eval_line',
'usage': 'dashboard',
'context_domain': '[["evaluation", "=", %d]]' % evaluation.id,
'context_domain': '[["evaluation", "=", %d]]' % (
evaluation.id),
}])
dashb_actview, = ActView.create([{
@ -253,12 +425,51 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
if len(to_write_dbaction) > 0:
DashboardAction.write(*to_write_dbaction)
cls.uiview_delete(evaluations)
if len(to_write_eval) > 0:
Evaluation2.write(*to_write_eval)
@classmethod
def validate(cls, records):
""" check dtype_x
"""
dtypes = []
dtypes.extend(cashbook_types)
dtypes.extend(category_types)
dtypes.extend(booktype_types)
dtypes.extend(currency_types)
for record in records:
if record.dtype1 not in dtypes:
raise UserError(gettext(
'cashbook_report.msg_invalid_dtype',
typename='one of: %(names)s' % {
'names': ', '.join(dtypes)}))
# dtype2...5 must be of same range
dt1 = record.dtype1.split('_')[0]
for x in range(2, 6):
dt_val = getattr(record, 'dtype%d' % x, None)
if dt_val:
if record.chart == 'pie':
raise UserError(gettext(
'cashbook_report.msg_no_pie_with_dtype2',
evalname=record.rec_name))
if dt_val not in dtypes:
raise UserError(gettext(
'cashbook_report.msg_invalid_dtype',
typename='one of: %(names)s' % {
'names': ', '.join(dtypes)}))
if not dt_val.startswith(dt1):
raise UserError(gettext(
'cashbook_report.msg_not_same_basetype',
typename=gettext(
'cashbook_report.msg_dtype_%s' % record.dtype1)
))
@classmethod
def create(cls, vlist):
""" add chart
@ -269,37 +480,48 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
@classmethod
def write(cls, *args):
""" unlink records if dtype changes
""" unlink records if dtypex changes
"""
to_write = []
to_update_uiview = []
dtypes = {'dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5'}
actions = iter(args)
for evaluations, values in zip(actions, actions):
# update ui-view if related fields change
if len(set({
'name', 'dtype', 'bgcolor', 'maincolor',
'legend', 'chart'}).intersection(values.keys())) > 0:
uiview_fields = {
'name', 'bgcolor', 'maincolor', 'legend', 'chart'}
uiview_fields.update(dtypes)
if uiview_fields.intersection(values.keys()):
to_update_uiview.extend(evaluations)
# unlink records if dtype changes
if 'dtype' in values.keys():
# unlink records if dtype(x) changes
if set(values.keys()).intersection(dtypes):
for evaluation in evaluations:
if evaluation.dtype == values['dtype']:
dt_value = {x: values.get(x, None) for x in dtypes}
dt_eval = {x: getattr(evaluation, x, None) for x in dtypes}
# skip un-link if same values are to write
if dt_value == dt_eval:
continue
dtype1 = values.get('dtype1', evaluation.dtype1)
for dt in [
'cashbooks', 'types', 'currencies',
'categories']:
if (not values['dtype'].startswith(dt)) and \
(len(getattr(evaluation, dt)) > 0):
to_write.extend([
[evaluation],
{
dt: [('remove', [
x.id for x in getattr(
evaluation, dt)])],
}])
if dtype1.startswith(dt):
continue
lines = getattr(evaluation, dt)
if not lines:
continue
to_write.extend([
[evaluation],
{
dt: [('remove', [x.id for x in lines])],
}])
args = list(args)
args.extend(to_write)

View file

@ -18,21 +18,21 @@ class InvestmentEvaluation(metaclass=PoolMeta):
result = super(InvestmentEvaluation, cls).get_sel_etype()
result.extend([
('cashbooks_gldiff', gettext(
'cashbook_report.msg_dtype_cashbook_gldiff')),
'cashbook_report.msg_dtype_cashbooks_gldiff')),
('cashbooks_glperc', gettext(
'cashbook_report.msg_dtype_cashbook_glperc')),
'cashbook_report.msg_dtype_cashbooks_glperc')),
('cashbooks_glvalue', gettext(
'cashbook_report.msg_dtype_cashbooks_glvalue')),
('cashbooks_glyield', gettext(
'cashbook_report.msg_dtype_cashbooks_glyield')),
('category_gldiff', gettext(
'cashbook_report.msg_dtype_category_gldiff')),
('category_glvalue', gettext(
'cashbook_report.msg_dtype_category_glvalue')),
('category_glperc', gettext(
'cashbook_report.msg_dtype_category_glperc')),
('category_glyield', gettext(
'cashbook_report.msg_dtype_category_glyield')),
('categories_gldiff', gettext(
'cashbook_report.msg_dtype_categories_gldiff')),
('categories_glvalue', gettext(
'cashbook_report.msg_dtype_categories_glvalue')),
('categories_glperc', gettext(
'cashbook_report.msg_dtype_categories_glperc')),
('categories_glyield', gettext(
'cashbook_report.msg_dtype_categories_glyield')),
('types_gldiff', gettext(
'cashbook_report.msg_dtype_types_gldiff')),
('types_glvalue', gettext(
@ -142,7 +142,7 @@ class InvestmentLine(metaclass=PoolMeta):
books[0].currency, book.yield_balance)
return result
def get_value_category_glperc(self):
def get_value_categories_glperc(self):
""" get percent of profit/loss by category
"""
if self.category is None:
@ -151,7 +151,7 @@ class InvestmentLine(metaclass=PoolMeta):
return self.get_percent_by_query([
('categories.id', '=', self.category.id)])
def get_value_category_gldiff(self):
def get_value_categories_gldiff(self):
""" get difference amount by category
"""
if self.category is None:
@ -160,7 +160,7 @@ class InvestmentLine(metaclass=PoolMeta):
return self.get_difference_by_query([
('categories.id', '=', self.category.id)])
def get_value_category_glvalue(self):
def get_value_categories_glvalue(self):
""" get current value by category
"""
if self.category is None:
@ -169,7 +169,7 @@ class InvestmentLine(metaclass=PoolMeta):
return self.get_currentvalue_by_query([
('categories.id', '=', self.category.id)])
def get_value_category_glyield(self):
def get_value_categories_glyield(self):
""" get total yield by type
"""
if self.category is None:

194
line.py
View file

@ -6,7 +6,7 @@
from decimal import Decimal
from sql.aggregate import Sum
from trytond.model import ModelView, ModelSQL, fields
from trytond.pyson import Eval
from trytond.pyson import Eval, Bool
from trytond.transaction import Transaction
from trytond.i18n import gettext
from trytond.exceptions import UserError
@ -26,30 +26,38 @@ class EvaluationLine(ModelSQL, ModelView):
string='Cashbook', select=True, ondelete='CASCADE',
model_name='cashbook.book',
states={
'required': Eval('eval_dtype', '').in_(cashbook_types),
}, depends=['eval_dtype'])
'required': Eval('eval_dtype1', '').in_(cashbook_types),
}, depends=['eval_dtype1'])
dtype = fields.Many2One(
string='Type', select=True, ondelete='CASCADE',
model_name='cashbook.type',
states={
'required': Eval('eval_dtype', '').in_(booktype_types),
}, depends=['eval_dtype'])
'required': Eval('eval_dtype1', '').in_(booktype_types),
}, depends=['eval_dtype1'])
currency = fields.Many2One(
string='Currency', select=True, ondelete='CASCADE',
model_name='currency.currency',
states={
'required': Eval('eval_dtype', '') == 'currencies',
}, depends=['eval_dtype'])
'required': Eval('eval_dtype1', '') == 'currencies',
}, depends=['eval_dtype1'])
category = fields.Many2One(
string='Category', select=True, ondelete='CASCADE',
model_name='cashbook.bookcategory',
states={
'required': Eval('eval_dtype', '').in_(category_types),
}, depends=['eval_dtype'])
'required': Eval('eval_dtype1', '').in_(category_types),
}, depends=['eval_dtype1'])
# dtype + currency of evaluation
eval_dtype = fields.Function(fields.Char(
string='Data type', readonly=True), 'on_change_with_eval_dtype')
# dtypes + currency of evaluation
eval_dtype1 = fields.Function(fields.Char(
string='Data type 1', readonly=True), 'on_change_with_eval_dtype1')
eval_dtype2 = fields.Function(fields.Char(
string='Data type 2', readonly=True), 'on_change_with_eval_dtype2')
eval_dtype3 = fields.Function(fields.Char(
string='Data type 3', readonly=True), 'on_change_with_eval_dtype3')
eval_dtype4 = fields.Function(fields.Char(
string='Data type 4', readonly=True), 'on_change_with_eval_dtype4')
eval_dtype5 = fields.Function(fields.Char(
string='Data type 5', readonly=True), 'on_change_with_eval_dtype5')
eval_currency = fields.Function(fields.Many2One(
model_name='currency.currency',
string="Currency", readonly=True), 'on_change_with_eval_currency')
@ -60,11 +68,35 @@ class EvaluationLine(ModelSQL, ModelView):
name = fields.Function(fields.Char(
string='Name'), 'on_change_with_name', setter='set_name_data')
name_line = fields.Char(string='Name', states={'invisible': True})
balance = fields.Function(fields.Numeric(
string='Balance',
value1 = fields.Function(fields.Numeric(
string='Value 1',
readonly=True, digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits']),
'on_change_with_balance')
'on_change_with_value1')
value2 = fields.Function(fields.Numeric(
string='Value 2',
readonly=True, digits=(16, Eval('currency_digits', 2)),
states={'invisible': ~Bool(Eval('eval_dtype2', ''))},
depends=['currency_digits', 'eval_dtype2']),
'on_change_with_value2')
value3 = fields.Function(fields.Numeric(
string='Value 3',
readonly=True, digits=(16, Eval('currency_digits', 2)),
states={'invisible': ~Bool(Eval('eval_dtype3', ''))},
depends=['currency_digits', 'eval_dtype3']),
'on_change_with_value3')
value4 = fields.Function(fields.Numeric(
string='Value 4',
readonly=True, digits=(16, Eval('currency_digits', 2)),
states={'invisible': ~Bool(Eval('eval_dtype4', ''))},
depends=['currency_digits', 'eval_dtype4']),
'on_change_with_value4')
value5 = fields.Function(fields.Numeric(
string='Value 5',
readonly=True, digits=(16, Eval('currency_digits', 2)),
states={'invisible': ~Bool(Eval('eval_dtype5', ''))},
depends=['currency_digits', 'eval_dtype5']),
'on_change_with_value5')
@classmethod
def set_name_data(cls, lines, name, value):
@ -98,12 +130,40 @@ class EvaluationLine(ModelSQL, ModelView):
return super(EvaluationLine, cls).fields_view_get(
view_id=view_id, view_type=view_type)
@fields.depends('evaluation', '_parent_evaluation.dtype')
def on_change_with_eval_dtype(self, name=None):
""" get dtype from parent
@fields.depends('evaluation', '_parent_evaluation.dtype1')
def on_change_with_eval_dtype1(self, name=None):
""" get dtype1 from parent
"""
if self.evaluation:
return self.evaluation.dtype
return self.evaluation.dtype1
@fields.depends('evaluation', '_parent_evaluation.dtype2')
def on_change_with_eval_dtype2(self, name=None):
""" get dtype2 from parent
"""
if self.evaluation:
return self.evaluation.dtype2
@fields.depends('evaluation', '_parent_evaluation.dtype3')
def on_change_with_eval_dtype3(self, name=None):
""" get dtype3 from parent
"""
if self.evaluation:
return self.evaluation.dtype3
@fields.depends('evaluation', '_parent_evaluation.dtype4')
def on_change_with_eval_dtype4(self, name=None):
""" get dtype4 from parent
"""
if self.evaluation:
return self.evaluation.dtype4
@fields.depends('evaluation', '_parent_evaluation.dtype5')
def on_change_with_eval_dtype5(self, name=None):
""" get dtype5 from parent
"""
if self.evaluation:
return self.evaluation.dtype5
@fields.depends('evaluation', '_parent_evaluation.currency')
def on_change_with_eval_currency(self, name=None):
@ -122,7 +182,7 @@ class EvaluationLine(ModelSQL, ModelView):
return 2
@fields.depends(
'eval_dtype', 'category', 'cashbook', 'dtype', 'currency',
'eval_dtype1', 'category', 'cashbook', 'dtype', 'currency',
'name_line')
def on_change_with_name(self, name=None):
""" get name of Type
@ -133,14 +193,14 @@ class EvaluationLine(ModelSQL, ModelView):
return self.name_line
# otherwise use rec_name of linked record
if self.eval_dtype:
if self.eval_dtype1:
dtype_sel = {'currencies': 'currency'}
dtype_sel.update({x: 'cashbook' for x in cashbook_types})
dtype_sel.update({x: 'category' for x in category_types})
dtype_sel.update({x: 'dtype' for x in booktype_types})
return getattr(
getattr(self, dtype_sel[self.eval_dtype], None),
getattr(self, dtype_sel[self.eval_dtype1], None),
'rec_name', None)
def convert_to_evalcurrency(self, from_currency, amount):
@ -160,28 +220,28 @@ class EvaluationLine(ModelSQL, ModelView):
"""
super(EvaluationLine, cls).validate(records)
for record in records:
if (record.evaluation.dtype not in cashbook_types) and \
if (record.evaluation.dtype1 not in cashbook_types) and \
(record.cashbook is not None):
raise UserError(gettext(
'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_cashbook')))
if (record.evaluation.dtype not in booktype_types) and \
typename=gettext('cashbook_report.msg_dtype_cashbooks')))
if (record.evaluation.dtype1 not in booktype_types) and \
(record.dtype is not None):
raise UserError(gettext(
'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_type')))
if (record.evaluation.dtype != 'currencies') and \
typename=gettext('cashbook_report.msg_dtype_types')))
if (record.evaluation.dtype1 != 'currencies') and \
(record.currency is not None):
raise UserError(gettext(
'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_currency')))
if (record.evaluation.dtype not in category_types) and \
typename=gettext('cashbook_report.msg_dtype_currencies')))
if (record.evaluation.dtype1 not in category_types) and \
(record.category is not None):
raise UserError(gettext(
'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_category')))
typename=gettext('cashbook_report.msg_dtype_categories')))
def get_balance_by_query(self, query):
def get_value_by_query(self, query):
""" run 'query' on Lines, convert used
currencies to evaluation-currency
"""
@ -209,10 +269,10 @@ class EvaluationLine(ModelSQL, ModelView):
Sum(tab_line.credit - tab_line.debit).as_('balance'),
group_by=[tab_book.currency])
cursor.execute(*query)
balances = cursor.fetchall()
records = cursor.fetchall()
for balance in balances:
(id_currency, bal1) = balance
for record in records:
(id_currency, bal1) = record
if bal1 is not None:
total_amount += self.convert_to_evalcurrency(
@ -235,7 +295,7 @@ class EvaluationLine(ModelSQL, ModelView):
if self.category is None:
return None
return self.get_balance_by_query([
return self.get_value_by_query([
('cashbook.categories.id', '=', self.category.id),
('cashbook.state', '=', 'open'),
('date', '<=', IrDate.today())])
@ -249,7 +309,7 @@ class EvaluationLine(ModelSQL, ModelView):
if self.dtype is None:
return None
return self.get_balance_by_query([
return self.get_value_by_query([
('cashbook.btype.id', '=', self.dtype.id),
('cashbook.state', '=', 'open'),
('date', '<=', IrDate.today())])
@ -263,22 +323,74 @@ class EvaluationLine(ModelSQL, ModelView):
if self.currency is None:
return None
return self.get_balance_by_query([
return self.get_value_by_query([
('cashbook.currency.id', '=', self.currency.id),
('cashbook.state', '=', 'open'),
('date', '<=', IrDate.today())])
@fields.depends(
'eval_dtype', 'eval_currency', 'currency_digits',
'eval_dtype1', 'eval_currency', 'currency_digits',
'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance',
'category', '_parent_category.id',
'evaluation', '_parent_evaluation.id', 'dtype', 'currency')
def on_change_with_balance(self, name=None):
def on_change_with_value1(self, name=None):
""" balance of value1
"""
if (self.evaluation is None) or (self.eval_currency is None) or \
(self.currency_digits is None) or (self.eval_dtype1 is None):
return None
return getattr(self, 'get_value_%s' % self.eval_dtype1)()
@fields.depends(
'eval_dtype2', 'eval_currency', 'currency_digits',
'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance',
'category', '_parent_category.id',
'evaluation', '_parent_evaluation.id', 'dtype', 'currency')
def on_change_with_value2(self, name=None):
""" balance of value2
"""
if (self.evaluation is None) or (self.eval_currency is None) or \
(self.currency_digits is None) or (self.eval_dtype2 is None):
return None
return getattr(self, 'get_value_%s' % self.eval_dtype2)()
@fields.depends(
'eval_dtype3', 'eval_currency', 'currency_digits',
'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance',
'category', '_parent_category.id',
'evaluation', '_parent_evaluation.id', 'dtype', 'currency')
def on_change_with_value3(self, name=None):
""" balance of value3
"""
if (self.evaluation is None) or (self.eval_currency is None) or \
(self.currency_digits is None) or (self.eval_dtype3 is None):
return None
return getattr(self, 'get_value_%s' % self.eval_dtype3)()
@fields.depends(
'eval_dtype4', 'eval_currency', 'currency_digits',
'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance',
'category', '_parent_category.id',
'evaluation', '_parent_evaluation.id', 'dtype', 'currency')
def on_change_with_value4(self, name=None):
""" balance of value4
"""
if (self.evaluation is None) or (self.eval_currency is None) or \
(self.currency_digits is None) or (self.eval_dtype4 is None):
return None
return getattr(self, 'get_value_%s' % self.eval_dtype4)()
@fields.depends(
'eval_dtype5', 'eval_currency', 'currency_digits',
'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance',
'category', '_parent_category.id',
'evaluation', '_parent_evaluation.id', 'dtype', 'currency')
def on_change_with_value5(self, name=None):
""" balance of cashbook
"""
if (self.evaluation is None) or (self.eval_currency is None) or \
(self.currency_digits is None) or (self.eval_dtype is None):
(self.currency_digits is None) or (self.eval_dtype5 is None):
return None
return getattr(self, 'get_value_%s' % self.eval_dtype)()
return getattr(self, 'get_value_%s' % self.eval_dtype5)()
# end EvaluationLine

View file

@ -10,15 +10,15 @@ msgctxt "model:ir.message,text:msg_name_cashbook"
msgid "Type of evaluation must be '%(typename)s'."
msgstr "Typ der Auswertung mus '%(typename)s' sein."
msgctxt "model:ir.message,text:msg_dtype_cashbook"
msgctxt "model:ir.message,text:msg_dtype_cashbooks"
msgid "Cashbooks [Amount]"
msgstr "Kassenbücher [Betrag]"
msgctxt "model:ir.message,text:msg_dtype_cashbook_gldiff"
msgctxt "model:ir.message,text:msg_dtype_cashbooks_gldiff"
msgid "Cashbooks [Amount of Profit/Loss]"
msgstr "Kassenbücher [Betrag Gewinn/Verlust]"
msgctxt "model:ir.message,text:msg_dtype_cashbook_glperc"
msgctxt "model:ir.message,text:msg_dtype_cashbooks_glperc"
msgid "Cashbooks [Percent of Profit/Loss]"
msgstr "Kassenbücher [Prozent Gewinn/Verlust]"
@ -30,7 +30,7 @@ msgctxt "model:ir.message,text:msg_dtype_cashbooks_glyield"
msgid "Cashbooks [Total Yield]"
msgstr "Kassenbücher [Gesamtertrag]"
msgctxt "model:ir.message,text:msg_dtype_type"
msgctxt "model:ir.message,text:msg_dtype_types"
msgid "Types of Cashbooks [Amount]"
msgstr "Typen von Kassenbüchern [Betrag]"
@ -50,27 +50,27 @@ msgctxt "model:ir.message,text:msg_dtype_types_glyield"
msgid "Types of Cashbooks [Total Yield]"
msgstr "Typen von Kassenbüchern [Gesamtertrag]"
msgctxt "model:ir.message,text:msg_dtype_currency"
msgctxt "model:ir.message,text:msg_dtype_currencies"
msgid "Currencies"
msgstr "Währungen"
msgctxt "model:ir.message,text:msg_dtype_category"
msgctxt "model:ir.message,text:msg_dtype_categories"
msgid "Categories [Amount]"
msgstr "Kategorien [Betrag]"
msgctxt "model:ir.message,text:msg_dtype_category_gldiff"
msgctxt "model:ir.message,text:msg_dtype_categories_gldiff"
msgid "Categories [Amount of Profit/Loss]"
msgstr "Kategorien [Betrag Gewinn/Verlust]"
msgctxt "model:ir.message,text:msg_dtype_category_glvalue"
msgctxt "model:ir.message,text:msg_dtype_categories_glvalue"
msgid "Categories [Current Value]"
msgstr "Kategorien [aktueller Wert]"
msgctxt "model:ir.message,text:msg_dtype_category_glperc"
msgctxt "model:ir.message,text:msg_dtype_categories_glperc"
msgid "Categories [Percent of Profit/Loss]"
msgstr "Kategorien [Prozent Gewinn/Verlust]"
msgctxt "model:ir.message,text:msg_dtype_category_glyield"
msgctxt "model:ir.message,text:msg_dtype_categories_glyield"
msgid "Categories [Total Yield]"
msgstr "Kategorien [Gesamtertrag]"
@ -78,6 +78,14 @@ msgctxt "model:ir.message,text:msg_name_graph"
msgid "Graph: %(gname)s"
msgstr "Diagramm: %(gname)s"
msgctxt "model:ir.message,text:msg_not_same_basetype"
msgid "Type of evaluation must be of the same base type like '%(typename)s'."
msgstr "Die Art der Auswertung muss vom gleichen Basistyp wie '%(typename)s' sein."
msgctxt "model:ir.message,text:msg_no_pie_with_dtype2"
msgid "The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'."
msgstr "Die Tortendarstellung kann nicht mehreren Datenquellen verwendet werden, in der Auswertung '%(evalname)s'."
#################
# ir.rule.group #
@ -134,17 +142,49 @@ msgctxt "field:cashbook_report.eval_line,currency_digits:"
msgid "Currency Digits"
msgstr "Nachkommastellen Währung"
msgctxt "field:cashbook_report.eval_line,eval_dtype:"
msgid "Data type"
msgstr "Datenart"
msgctxt "field:cashbook_report.eval_line,eval_dtype1:"
msgid "Data type 1"
msgstr "Datenart 1"
msgctxt "field:cashbook_report.eval_line,eval_dtype2:"
msgid "Data type 2"
msgstr "Datenart 2"
msgctxt "field:cashbook_report.eval_line,eval_dtype3:"
msgid "Data type 3"
msgstr "Datenart 3"
msgctxt "field:cashbook_report.eval_line,eval_dtype4:"
msgid "Data type 4"
msgstr "Datenart 4"
msgctxt "field:cashbook_report.eval_line,eval_dtype5:"
msgid "Data type 5"
msgstr "Datenart 5"
msgctxt "field:cashbook_report.eval_line,name:"
msgid "Name"
msgstr "Name"
msgctxt "field:cashbook_report.eval_line,balance:"
msgid "Balance"
msgstr "Saldo"
msgctxt "field:cashbook_report.eval_line,value1:"
msgid "Value 1"
msgstr "Wert 1"
msgctxt "field:cashbook_report.eval_line,value2:"
msgid "Value 2"
msgstr "Wert 2"
msgctxt "field:cashbook_report.eval_line,value3:"
msgid "Value 3"
msgstr "Wert 3"
msgctxt "field:cashbook_report.eval_line,value4:"
msgid "Value 4"
msgstr "Wert 4"
msgctxt "field:cashbook_report.eval_line,value5:"
msgid "Value 5"
msgstr "Wert 5"
##############################
@ -166,31 +206,51 @@ msgctxt "view:cashbook_report.evaluation:"
msgid "Representation"
msgstr "Darstellung"
msgctxt "view:cashbook_report.evaluation:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"
msgctxt "field:cashbook_report.evaluation,name:"
msgid "Name"
msgstr "Name"
msgctxt "field:cashbook_report.evaluation,dtype:"
msgid "Data type"
msgstr "Datenart"
msgctxt "field:cashbook_report.evaluation,dtype1:"
msgid "Data type 1"
msgstr "Datenart 1"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Cashbooks"
msgstr "Kassenbücher"
msgctxt "help:cashbook_report.evaluation,dtype1:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Types of Cashbooks"
msgstr "Typen von Kassenbüchern"
msgctxt "field:cashbook_report.evaluation,dtype2:"
msgid "Data type 2"
msgstr "Datenart 2"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Currencys"
msgstr "Währungen"
msgctxt "help:cashbook_report.evaluation,dtype2:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Categories"
msgstr "Kategorien"
msgctxt "field:cashbook_report.evaluation,dtype3:"
msgid "Data type 3"
msgstr "Datenart 3"
msgctxt "help:cashbook_report.evaluation,dtype:"
msgctxt "help:cashbook_report.evaluation,dtype3:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"
msgctxt "field:cashbook_report.evaluation,dtype4:"
msgid "Data type 4"
msgstr "Datenart 4"
msgctxt "help:cashbook_report.evaluation,dtype4:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"
msgctxt "field:cashbook_report.evaluation,dtype5:"
msgid "Data type 5"
msgstr "Datenart 5"
msgctxt "help:cashbook_report.evaluation,dtype5:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"

View file

@ -6,15 +6,15 @@ msgctxt "model:ir.message,text:msg_name_cashbook"
msgid "Type of evaluation must be '%(typename)s'."
msgstr "Type of evaluation must be '%(typename)s'."
msgctxt "model:ir.message,text:msg_dtype_cashbook"
msgctxt "model:ir.message,text:msg_dtype_cashbooks"
msgid "Cashbooks [Amount]"
msgstr "Cashbooks [Amount]"
msgctxt "model:ir.message,text:msg_dtype_cashbook_gldiff"
msgctxt "model:ir.message,text:msg_dtype_cashbooks_gldiff"
msgid "Cashbooks [Amount of Profit/Loss]"
msgstr "Cashbooks [Amount of Profit/Loss]"
msgctxt "model:ir.message,text:msg_dtype_cashbook_glperc"
msgctxt "model:ir.message,text:msg_dtype_cashbooks_glperc"
msgid "Cashbooks [Percent of Profit/Loss]"
msgstr "Cashbooks [Percent of Profit/Loss]"
@ -26,7 +26,7 @@ msgctxt "model:ir.message,text:msg_dtype_cashbooks_glyield"
msgid "Cashbooks [Total Yield]"
msgstr "Cashbooks [Total Yield]"
msgctxt "model:ir.message,text:msg_dtype_type"
msgctxt "model:ir.message,text:msg_dtype_types"
msgid "Types of Cashbooks [Amount]"
msgstr "Types of Cashbooks [Amount]"
@ -46,27 +46,27 @@ msgctxt "model:ir.message,text:msg_dtype_types_glyield"
msgid "Types of Cashbooks [Total Yield]"
msgstr "Types of Cashbooks [Total Yield]"
msgctxt "model:ir.message,text:msg_dtype_currency"
msgctxt "model:ir.message,text:msg_dtype_currencies"
msgid "Currencies"
msgstr "Currencies"
msgctxt "model:ir.message,text:msg_dtype_category"
msgctxt "model:ir.message,text:msg_dtype_categories"
msgid "Categories [Amount]"
msgstr "Categories [Amount]"
msgctxt "model:ir.message,text:msg_dtype_category_gldiff"
msgctxt "model:ir.message,text:msg_dtype_categories_gldiff"
msgid "Categories [Amount of Profit/Loss]"
msgstr "Categories [Amount of Profit/Loss]"
msgctxt "model:ir.message,text:msg_dtype_category_glvalue"
msgctxt "model:ir.message,text:msg_dtype_categories_glvalue"
msgid "Categories [Current Value]"
msgstr "Categories [Current Value]"
msgctxt "model:ir.message,text:msg_dtype_category_glperc"
msgctxt "model:ir.message,text:msg_dtype_categories_glperc"
msgid "Categories [Percent of Profit/Loss]"
msgstr "Categories [Percent of Profit/Loss]"
msgctxt "model:ir.message,text:msg_dtype_category_glyield"
msgctxt "model:ir.message,text:msg_dtype_categories_glyield"
msgid "Categories [Total Yield]"
msgstr "Categories [Total Yield]"
@ -74,6 +74,14 @@ msgctxt "model:ir.message,text:msg_name_graph"
msgid "Graph: %(gname)s"
msgstr "Graph: %(gname)s"
msgctxt "model:ir.message,text:msg_not_same_basetype"
msgid "Type of evaluation must be of the same base type like '%(typename)s'."
msgstr "Type of evaluation must be of the same base type like '%(typename)s'."
msgctxt "model:ir.message,text:msg_no_pie_with_dtype2"
msgid "The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'."
msgstr "The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'."
msgctxt "model:ir.rule.group,name:rg_eval_write_adm"
msgid "Administrators: Evaluation read/write"
msgstr "Administrators: Evaluation read/write"
@ -118,17 +126,49 @@ msgctxt "field:cashbook_report.eval_line,currency_digits:"
msgid "Currency Digits"
msgstr "Currency Digits"
msgctxt "field:cashbook_report.eval_line,eval_dtype:"
msgid "Data type"
msgstr "Data type"
msgctxt "field:cashbook_report.eval_line,eval_dtype1:"
msgid "Data type 1"
msgstr "Data type 1"
msgctxt "field:cashbook_report.eval_line,eval_dtype2:"
msgid "Data type 2"
msgstr "Data type 2"
msgctxt "field:cashbook_report.eval_line,eval_dtype3:"
msgid "Data type 3"
msgstr "Data type 3"
msgctxt "field:cashbook_report.eval_line,eval_dtype4:"
msgid "Data type 4"
msgstr "Data type 4"
msgctxt "field:cashbook_report.eval_line,eval_dtype5:"
msgid "Data type 5"
msgstr "Data type 5"
msgctxt "field:cashbook_report.eval_line,name:"
msgid "Name"
msgstr "Name"
msgctxt "field:cashbook_report.eval_line,balance:"
msgid "Balance"
msgstr "Balance"
msgctxt "field:cashbook_report.eval_line,value1:"
msgid "Value 1"
msgstr "Value 1"
msgctxt "field:cashbook_report.eval_line,value2:"
msgid "Value 2"
msgstr "Value 2"
msgctxt "field:cashbook_report.eval_line,value3:"
msgid "Value 3"
msgstr "Value 3"
msgctxt "field:cashbook_report.eval_line,value4:"
msgid "Value 4"
msgstr "Value 4"
msgctxt "field:cashbook_report.eval_line,value5:"
msgid "Value 5"
msgstr "Value 5"
msgctxt "model:cashbook_report.evaluation,name:"
msgid "Evaluation"
@ -146,31 +186,51 @@ msgctxt "view:cashbook_report.evaluation:"
msgid "Representation"
msgstr "Representation"
msgctxt "view:cashbook_report.evaluation:"
msgid "Type of data displayed"
msgstr "Type of data displayed"
msgctxt "field:cashbook_report.evaluation,name:"
msgid "Name"
msgstr "Name"
msgctxt "field:cashbook_report.evaluation,dtype:"
msgid "Data type"
msgstr "Data type"
msgctxt "field:cashbook_report.evaluation,dtype1:"
msgid "Data type 1"
msgstr "Data type 1"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Cashbooks"
msgstr "Cashbooks"
msgctxt "help:cashbook_report.evaluation,dtype1:"
msgid "Type of data displayed"
msgstr "Type of data displayed"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Types of Cashbooks"
msgstr "Types of Cashbooks"
msgctxt "field:cashbook_report.evaluation,dtype2:"
msgid "Data type 2"
msgstr "Data type 2"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Currencys"
msgstr "Currencys"
msgctxt "help:cashbook_report.evaluation,dtype2:"
msgid "Type of data displayed"
msgstr "Type of data displayed"
msgctxt "selection:cashbook_report.evaluation,dtype:"
msgid "Categories"
msgstr "Categories"
msgctxt "field:cashbook_report.evaluation,dtype3:"
msgid "Data type 3"
msgstr "Data type 3"
msgctxt "help:cashbook_report.evaluation,dtype:"
msgctxt "help:cashbook_report.evaluation,dtype3:"
msgid "Type of data displayed"
msgstr "Type of data displayed"
msgctxt "field:cashbook_report.evaluation,dtype4:"
msgid "Data type 4"
msgstr "Data type 4"
msgctxt "help:cashbook_report.evaluation,dtype4:"
msgid "Type of data displayed"
msgstr "Type of data displayed"
msgctxt "field:cashbook_report.evaluation,dtype5:"
msgid "Data type 5"
msgstr "Data type 5"
msgctxt "help:cashbook_report.evaluation,dtype5:"
msgid "Type of data displayed"
msgstr "Type of data displayed"

View file

@ -8,13 +8,16 @@ full copyright notices and license terms. -->
<record model="ir.message" id="msg_invalid_dtype">
<field name="text">Type of evaluation must be '%(typename)s'.</field>
</record>
<record model="ir.message" id="msg_dtype_cashbook">
<record model="ir.message" id="msg_not_same_basetype">
<field name="text">Type of evaluation must be of the same base type like '%(typename)s'.</field>
</record>
<record model="ir.message" id="msg_dtype_cashbooks">
<field name="text">Cashbooks [Amount]</field>
</record>
<record model="ir.message" id="msg_dtype_cashbook_gldiff">
<record model="ir.message" id="msg_dtype_cashbooks_gldiff">
<field name="text">Cashbooks [Amount of Profit/Loss]</field>
</record>
<record model="ir.message" id="msg_dtype_cashbook_glperc">
<record model="ir.message" id="msg_dtype_cashbooks_glperc">
<field name="text">Cashbooks [Percent of Profit/Loss]</field>
</record>
<record model="ir.message" id="msg_dtype_cashbooks_glvalue">
@ -23,7 +26,7 @@ full copyright notices and license terms. -->
<record model="ir.message" id="msg_dtype_cashbooks_glyield">
<field name="text">Cashbooks [Total Yield]</field>
</record>
<record model="ir.message" id="msg_dtype_type">
<record model="ir.message" id="msg_dtype_types">
<field name="text">Types of Cashbooks [Amount]</field>
</record>
<record model="ir.message" id="msg_dtype_types_gldiff">
@ -38,27 +41,30 @@ full copyright notices and license terms. -->
<record model="ir.message" id="msg_dtype_types_glyield">
<field name="text">Types of Cashbooks [Total Yield]</field>
</record>
<record model="ir.message" id="msg_dtype_currency">
<record model="ir.message" id="msg_dtype_currencies">
<field name="text">Currencies</field>
</record>
<record model="ir.message" id="msg_dtype_category">
<record model="ir.message" id="msg_dtype_categories">
<field name="text">Categories [Amount]</field>
</record>
<record model="ir.message" id="msg_dtype_category_gldiff">
<record model="ir.message" id="msg_dtype_categories_gldiff">
<field name="text">Categories [Amount of Profit/Loss]</field>
</record>
<record model="ir.message" id="msg_dtype_category_glvalue">
<record model="ir.message" id="msg_dtype_categories_glvalue">
<field name="text">Categories [Current Value]</field>
</record>
<record model="ir.message" id="msg_dtype_category_glperc">
<record model="ir.message" id="msg_dtype_categories_glperc">
<field name="text">Categories [Percent of Profit/Loss]</field>
</record>
<record model="ir.message" id="msg_dtype_category_glyield">
<record model="ir.message" id="msg_dtype_categories_glyield">
<field name="text">Categories [Total Yield]</field>
</record>
<record model="ir.message" id="msg_name_graph">
<field name="text">Graph: %(gname)s</field>
</record>
<record model="ir.message" id="msg_no_pie_with_dtype2">
<field name="text">The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'.</field>
</record>
</data>
</tryton>

View file

@ -7,13 +7,14 @@ cashbook_types = [
'cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc',
'cashbooks_glvalue', 'cashbooks_glyield']
category_types = [
'categories', 'category_gldiff', 'category_glvalue',
'category_glperc', 'category_glyield']
'categories', 'categories_gldiff', 'categories_glvalue',
'categories_glperc', 'categories_glyield']
booktype_types = [
'types', 'types_gldiff', 'types_glvalue',
'types_glperc', 'types_glyield']
currency_types = ['currencies']
template_view_line = '<field name="balance" fill="%(fill)s" ' + \
template_view_line = '<field name="%(fname)s" fill="%(fill)s" ' + \
'empty="0" string="%(string)s"/>'
template_view_graph = """<?xml version="1.0"?>

View file

@ -3,14 +3,16 @@
# The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms.
from datetime import date
from decimal import Decimal
from trytond.tests.test_tryton import with_transaction, activate_module
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.exceptions import UserError
from trytond.modules.cashbook_investment.tests import \
from trytond.i18n import gettext
CashbookInvestmentTestCase
from datetime import date
from decimal import Decimal
from trytond.modules.cashbook_report.templates import (
cashbook_types, category_types, booktype_types, currency_types)
class ReportTestCase(CashbookInvestmentTestCase):
@ -136,6 +138,21 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(books[2].balance, Decimal('23.0'))
return books
@with_transaction()
def test_report_check_dtype_messages_functions(self):
""" check access to messages and functions for 'dtypes'
"""
Line = Pool().get('cashbook_report.eval_line')
dtypes = []
dtypes.extend(currency_types)
dtypes.extend(cashbook_types)
dtypes.extend(category_types)
dtypes.extend(booktype_types)
for x in dtypes:
gettext('cashbook_report.msg_dtype_%s' % x)
getattr(Line, 'get_value_%s' % x)
@with_transaction()
def test_report_currency_hasbookings(self):
""" check detectpn of bookings @ currency
@ -254,7 +271,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation1, = Evaluation.create([{
'name': 'Evaluation User 1 - Cashbooks',
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books_owner1])],
}])
self.assertEqual(len(evaluation1.cashbooks), 2)
@ -264,18 +281,16 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation1.line_values[0].name,
'Book 1 | 25.00 usd | Open')
self.assertEqual(
evaluation1.line_values[0].balance,
Decimal('23.81'))
evaluation1.line_values[0].value1, Decimal('23.81'))
self.assertEqual(
evaluation1.line_values[1].name,
'Book 2 | 12.50 usd | Open')
self.assertEqual(
evaluation1.line_values[1].balance,
Decimal('11.9'))
evaluation1.line_values[1].value1, Decimal('11.9'))
evaluation2, = Evaluation.create([{
'name': 'Evaluation User 1 - Types',
'dtype': 'types',
'dtype1': 'types',
'types': [('add', [x.id for x in Type.search([])])],
}])
self.assertEqual(len(evaluation2.types), 2)
@ -283,16 +298,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation2.line_values), 2)
self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank')
self.assertEqual(
evaluation2.line_values[0].balance,
Decimal('0.0'))
evaluation2.line_values[0].value1, Decimal('0.0'))
self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash')
self.assertEqual(
evaluation2.line_values[1].balance,
Decimal('35.71'))
evaluation2.line_values[1].value1, Decimal('35.71'))
evaluation3, = Evaluation.create([{
'name': 'Evaluation User 1 - Currencies',
'dtype': 'currencies',
'dtype1': 'currencies',
'currencies': [('add', [
x.id for x in Currency.search([])])],
}])
@ -301,16 +314,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation3.line_values), 2)
self.assertEqual(evaluation3.line_values[0].name, 'Euro')
self.assertEqual(
evaluation3.line_values[0].balance,
Decimal('0.0'))
evaluation3.line_values[0].value1, Decimal('0.0'))
self.assertEqual(evaluation3.line_values[1].name, 'usd')
self.assertEqual(
evaluation3.line_values[1].balance,
Decimal('35.71'))
evaluation3.line_values[1].value1, Decimal('35.71'))
evaluation4, = Evaluation.create([{
'name': 'Evaluation User 1 - Categories',
'dtype': 'categories',
'dtype1': 'categories',
'categories': [('add', [
x.id for x in books_owner1[0].categories])],
}])
@ -318,11 +329,9 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation4.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation4.line_values), 1)
self.assertEqual(
evaluation4.line_values[0].name,
'Book 1, User 1')
evaluation4.line_values[0].name, 'Book 1, User 1')
self.assertEqual(
evaluation4.line_values[0].balance,
Decimal('23.81'))
evaluation4.line_values[0].value1, Decimal('23.81'))
self.assertEqual(Evaluation.search_count([]), 4)
@ -345,22 +354,20 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation1, = Evaluation.create([{
'name': 'Evaluation User 2 - Cashbooks',
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books_owner2])],
}])
self.assertEqual(len(evaluation1.cashbooks), 1)
self.assertEqual(evaluation1.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation1.line_values), 1)
self.assertEqual(
evaluation1.line_values[0].name,
'Book 3 | 23.00 € | Open')
evaluation1.line_values[0].name, 'Book 3 | 23.00 € | Open')
self.assertEqual(
evaluation1.line_values[0].balance,
Decimal('23.0'))
evaluation1.line_values[0].value1, Decimal('23.0'))
evaluation2, = Evaluation.create([{
'name': 'Evaluation User 2 - Types',
'dtype': 'types',
'dtype1': 'types',
'types': [('add', [x.id for x in Type.search([])])],
}])
self.assertEqual(len(evaluation2.types), 2)
@ -368,16 +375,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation2.line_values), 2)
self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank')
self.assertEqual(
evaluation2.line_values[0].balance,
Decimal('23.0'))
evaluation2.line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash')
self.assertEqual(
evaluation2.line_values[1].balance,
Decimal('0.0'))
evaluation2.line_values[1].value1, Decimal('0.0'))
evaluation3, = Evaluation.create([{
'name': 'Evaluation User 2 - Currencies',
'dtype': 'currencies',
'dtype1': 'currencies',
'currencies': [('add', [
x.id for x in Currency.search([])])],
}])
@ -386,16 +391,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation3.line_values), 2)
self.assertEqual(evaluation3.line_values[0].name, 'Euro')
self.assertEqual(
evaluation3.line_values[0].balance,
Decimal('23.0'))
evaluation3.line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluation3.line_values[1].name, 'usd')
self.assertEqual(
evaluation3.line_values[1].balance,
Decimal('0.0'))
evaluation3.line_values[1].value1, Decimal('0.0'))
evaluation4, = Evaluation.create([{
'name': 'Evaluation User 2 - Categories',
'dtype': 'categories',
'dtype1': 'categories',
'categories': [('add', [
x.id for x in books_owner2[0].categories])],
}])
@ -403,11 +406,9 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation4.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation4.line_values), 1)
self.assertEqual(
evaluation4.line_values[0].name,
'Book 3, User 2')
evaluation4.line_values[0].name, 'Book 3, User 2')
self.assertEqual(
evaluation4.line_values[0].balance,
Decimal('23.0'))
evaluation4.line_values[0].value1, Decimal('23.0'))
self.assertEqual(Evaluation.search_count([]), 4)
@ -421,17 +422,13 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluations[0].currency.rec_name, 'Euro')
self.assertEqual(len(evaluations[0].line_values), 2)
self.assertEqual(
evaluations[0].line_values[0].name,
'Book 1 | 25.00 usd | Open')
evaluations[0].line_values[0].name, 'Book 1 | 25.00 usd | Open')
self.assertEqual(
evaluations[0].line_values[0].balance,
Decimal('23.81'))
evaluations[0].line_values[0].value1, Decimal('23.81'))
self.assertEqual(
evaluations[0].line_values[1].name,
'Book 2 | 12.50 usd | Open')
evaluations[0].line_values[1].name, 'Book 2 | 12.50 usd | Open')
self.assertEqual(
evaluations[0].line_values[1].balance,
Decimal('11.9'))
evaluations[0].line_values[1].value1, Decimal('11.9'))
self.assertEqual(evaluations[1].name, 'Evaluation User 1 - Categories')
self.assertEqual(len(evaluations[1].categories), 1)
@ -439,8 +436,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[1].line_values), 1)
self.assertEqual(evaluations[1].line_values[0].name, 'Book 1, User 1')
self.assertEqual(
evaluations[1].line_values[0].balance,
Decimal('23.81'))
evaluations[1].line_values[0].value1, Decimal('23.81'))
self.assertEqual(evaluations[2].name, 'Evaluation User 1 - Currencies')
self.assertEqual(len(evaluations[2].currencies), 2)
@ -448,12 +444,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[2].line_values), 2)
self.assertEqual(evaluations[2].line_values[0].name, 'Euro')
self.assertEqual(
evaluations[2].line_values[0].balance,
Decimal('23.0'))
evaluations[2].line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluations[2].line_values[1].name, 'usd')
self.assertEqual(
evaluations[2].line_values[1].balance,
Decimal('35.71'))
evaluations[2].line_values[1].value1, Decimal('35.71'))
self.assertEqual(evaluations[3].name, 'Evaluation User 1 - Types')
self.assertEqual(len(evaluations[3].types), 2)
@ -461,23 +455,19 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[3].line_values), 2)
self.assertEqual(evaluations[3].line_values[0].name, 'BK - Bank')
self.assertEqual(
evaluations[3].line_values[0].balance,
Decimal('23.0'))
evaluations[3].line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluations[3].line_values[1].name, 'CAS - Cash')
self.assertEqual(
evaluations[3].line_values[1].balance,
Decimal('35.71'))
evaluations[3].line_values[1].value1, Decimal('35.71'))
self.assertEqual(evaluations[4].name, 'Evaluation User 2 - Cashbooks')
self.assertEqual(len(evaluations[4].cashbooks), 1)
self.assertEqual(evaluations[4].currency.rec_name, 'Euro')
self.assertEqual(len(evaluations[4].line_values), 1)
self.assertEqual(
evaluations[4].line_values[0].name,
'Book 3 | 23.00 € | Open')
evaluations[4].line_values[0].name, 'Book 3 | 23.00 € | Open')
self.assertEqual(
evaluations[4].line_values[0].balance,
Decimal('23.0'))
evaluations[4].line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluations[5].name, 'Evaluation User 2 - Categories')
self.assertEqual(len(evaluations[5].categories), 1)
@ -485,8 +475,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[5].line_values), 1)
self.assertEqual(evaluations[5].line_values[0].name, 'Book 3, User 2')
self.assertEqual(
evaluations[5].line_values[0].balance,
Decimal('23.0'))
evaluations[5].line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluations[6].name, 'Evaluation User 2 - Currencies')
self.assertEqual(len(evaluations[6].currencies), 2)
@ -494,12 +483,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[6].line_values), 2)
self.assertEqual(evaluations[6].line_values[0].name, 'Euro')
self.assertEqual(
evaluations[6].line_values[0].balance,
Decimal('23.0'))
evaluations[6].line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluations[6].line_values[1].name, 'usd')
self.assertEqual(
evaluations[6].line_values[1].balance,
Decimal('35.71'))
evaluations[6].line_values[1].value1, Decimal('35.71'))
self.assertEqual(evaluations[7].name, 'Evaluation User 2 - Types')
self.assertEqual(len(evaluations[7].types), 2)
@ -507,12 +494,99 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[7].line_values), 2)
self.assertEqual(evaluations[7].line_values[0].name, 'BK - Bank')
self.assertEqual(
evaluations[7].line_values[0].balance,
Decimal('23.0'))
evaluations[7].line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluations[7].line_values[1].name, 'CAS - Cash')
self.assertEqual(
evaluations[7].line_values[1].balance,
Decimal('35.71'))
evaluations[7].line_values[1].value1, Decimal('35.71'))
@with_transaction()
def test_report_check_allowed_dtypes(self):
""" check allowed dtypes for dtype2...5 in depency of value in dtype
"""
pool = Pool()
Evaluation = pool.get('cashbook_report.evaluation')
self.prep_report_3books()
company = self.prep_company()
with Transaction().set_context({
'company': company.id}):
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype1': 'cashbooks',
}])
self.assertEqual(len(evaluation.cashbooks), 0)
self.assertEqual([
x[0] for x in evaluation.get_sel_etype2()], [
'', 'cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc',
'cashbooks_glvalue', 'cashbooks_glyield'])
self.assertRaisesRegex(
UserError,
'The value "types" for field "Data type 2" in ' +
'"Evaluation 1" of "Evaluation" is not one of the ' +
'allowed options.',
Evaluation.write,
*[
[evaluation],
{
'dtype2': 'types',
}
])
self.assertRaisesRegex(
UserError,
"The pie display cannot be used by multiple data sources" +
" in the evaluation 'Evaluation 1'.",
Evaluation.write,
*[[evaluation], {'dtype2': 'cashbooks_glyield'}])
Evaluation.write(*[
[evaluation],
{
'chart': 'line',
'dtype2': 'cashbooks_glyield',
'dtype3': 'cashbooks_glvalue',
}])
self.assertEqual(evaluation.dtype1, 'cashbooks')
self.assertEqual(evaluation.dtype2, 'cashbooks_glyield')
self.assertEqual(evaluation.dtype3, 'cashbooks_glvalue')
# run on-cchange
evaluation.dtype1 = 'types'
evaluation.on_change_dtype1()
evaluation.save()
self.assertEqual(evaluation.dtype1, 'types')
self.assertEqual(evaluation.dtype2, None)
self.assertEqual(evaluation.dtype3, None)
Evaluation.write(*[
[evaluation],
{
'dtype1': 'categories_gldiff',
}])
self.assertEqual([
x[0] for x in evaluation.get_sel_etype2()], [
'', 'categories', 'categories_gldiff', 'categories_glvalue',
'categories_glperc', 'categories_glyield'])
Evaluation.write(*[
[evaluation],
{
'dtype1': 'currencies',
}])
self.assertEqual([
x[0] for x in evaluation.get_sel_etype2()], [
'', 'currencies'])
Evaluation.write(*[
[evaluation],
{
'dtype1': 'types_glperc',
}])
self.assertEqual([
x[0] for x in evaluation.get_sel_etype2()], [
'', 'types', 'types_gldiff', 'types_glvalue',
'types_glperc', 'types_glyield'])
@with_transaction()
def test_report_update_name_of_line(self):
@ -530,7 +604,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
'company': company.id}):
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(len(evaluation.cashbooks), 3)
@ -592,7 +666,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
# valid
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(len(evaluation.cashbooks), 3)
@ -607,7 +681,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'cashbooks_gldiff',
'dtype1': 'cashbooks_gldiff',
}])
self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual(len(evaluation.types), 0)
@ -617,7 +691,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'cashbooks_glperc',
'dtype1': 'cashbooks_glperc',
}])
self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual(len(evaluation.types), 0)
@ -629,7 +703,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'types',
'dtype1': 'types',
'types': [('add', [x.id for x in Types.search([])])],
}])
self.assertEqual(len(evaluation.cashbooks), 0)
@ -641,7 +715,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'types',
'dtype1': 'types',
}])
self.assertEqual(len(evaluation.cashbooks), 0)
self.assertEqual(len(evaluation.types), 2)
@ -651,7 +725,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'currencies',
'dtype1': 'currencies',
'currencies': [('add', [
x.id for x in Currency.search([])])],
}])
@ -663,7 +737,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'categories',
'dtype1': 'categories',
'categories': [('add', [
x.id for x in Category.search([])])],
}])
@ -675,7 +749,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[
[evaluation],
{
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
}])
self.assertEqual(len(evaluation.cashbooks), 0)
self.assertEqual(len(evaluation.types), 0)
@ -698,7 +772,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
# valid
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])],
}])
@ -710,13 +784,13 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.create,
[{
'name': 'Evaluation 1',
'dtype': 'types', # wrong dtype
'dtype1': 'types', # wrong dtype
'cashbooks': [('add', [x.id for x in books])],
}])
evaluation, = Evaluation.create([{
'name': 'Evaluation 2',
'dtype': 'types',
'dtype1': 'types',
'types': [('add', [x.id for x in Types.search([])])],
}])
@ -728,7 +802,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.create,
[{
'name': 'Evaluation 3',
'dtype': 'cashbooks',
'dtype1': 'cashbooks',
'types': [('add', [x.id for x in Types.search([])])],
}])
@ -739,11 +813,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
"""
pool = Pool()
Evaluation = pool.get('cashbook_report.evaluation')
try:
DashboardAction = pool.get('dashboard.action')
except Exception:
print('\n--== Module "dashboard" not installed ==--')
DashboardAction = None
DashboardAction = pool.get('dashboard.action')
books = self.prep_report_3books()
@ -756,15 +826,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
}])
# add dashboard-action
if DashboardAction is not None:
dbaction, = DashboardAction.create([{
'user': Transaction().user,
'act_window': evaluation.dashb_actwin.id,
}])
self.assertEqual(dbaction.user.rec_name, 'Administrator')
self.assertEqual(dbaction.act_window.name, 'Evaluation 1')
dbaction, = DashboardAction.create([{
'user': Transaction().user,
'act_window': evaluation.dashb_actwin.id,
}])
self.assertEqual(dbaction.user.rec_name, 'Administrator')
self.assertEqual(dbaction.act_window.name, 'Evaluation 1')
self.assertEqual(evaluation.dtype, 'cashbooks')
self.assertEqual(evaluation.dtype1, 'cashbooks')
self.assertEqual(evaluation.chart, 'pie')
self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default')
@ -810,9 +879,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
'name': 'Evaluation 1a',
}])
self.assertTrue(old_win_id != evaluation.dashb_actwin.id)
if DashboardAction is not None:
self.assertEqual(DashboardAction.search_count([]), 1)
self.assertEqual(DashboardAction.search_count([]), 1)
@with_transaction()
def test_report_cashbook_yield(self):
@ -826,7 +893,6 @@ class ReportTestCase(CashbookInvestmentTestCase):
BType = pool.get('cashbook.type')
Asset = pool.get('investment.asset')
CbCategory = pool.get('cashbook.bookcategory')
MemCache = pool.get('cashbook.memcache')
company = self.prep_company()
with Transaction().set_context({
@ -906,7 +972,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
}])],
}])
Line.wfcheck(book_asset.lines)
MemCache._cashbook_value_cache.clear_all()
self.prep_valstore_run_worker()
self.assertEqual(
book_asset.rec_name,
@ -922,44 +988,41 @@ class ReportTestCase(CashbookInvestmentTestCase):
# evaluation: cashbooks - total yield
evaluation1, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'cashbooks_glyield',
'dtype1': 'cashbooks_glyield',
'chart': 'hbar',
'cashbooks': [('add', [book_asset.id])],
}])
self.assertEqual(evaluation1.dtype, 'cashbooks_glyield')
self.assertEqual(evaluation1.dtype1, 'cashbooks_glyield')
self.assertEqual(evaluation1.currency.code, 'usd')
self.assertEqual(len(evaluation1.line_values), 1)
self.assertEqual(
evaluation1.line_values[0].balance,
Decimal('5.5'))
evaluation1.line_values[0].value1, Decimal('5.5'))
# evaluation: categories - total yield
evaluation2, = Evaluation.create([{
'name': 'Evaluation 2',
'dtype': 'category_glyield',
'dtype1': 'categories_glyield',
'chart': 'hbar',
'categories': [('add', [book_asset.categories[0].id])],
}])
self.assertEqual(evaluation2.dtype, 'category_glyield')
self.assertEqual(evaluation2.dtype1, 'categories_glyield')
self.assertEqual(evaluation2.currency.code, 'usd')
self.assertEqual(len(evaluation2.line_values), 1)
self.assertEqual(
evaluation2.line_values[0].balance,
Decimal('5.5'))
evaluation2.line_values[0].value1, Decimal('5.5'))
# evaluation: types - total yield
evaluation3, = Evaluation.create([{
'name': 'Evaluation 3',
'dtype': 'types_glyield',
'dtype1': 'types_glyield',
'chart': 'hbar',
'types': [('add', [book_asset.btype.id])],
}])
self.assertEqual(evaluation3.dtype, 'types_glyield')
self.assertEqual(evaluation3.dtype1, 'types_glyield')
self.assertEqual(evaluation3.currency.code, 'usd')
self.assertEqual(len(evaluation3.line_values), 1)
self.assertEqual(
evaluation3.line_values[0].balance,
Decimal('5.5'))
evaluation3.line_values[0].value1, Decimal('5.5'))
@with_transaction()
def test_report_chart_hbar_book_investment(self):
@ -979,7 +1042,6 @@ class ReportTestCase(CashbookInvestmentTestCase):
Product = pool.get('product.template')
Uom = pool.get('product.uom')
CbCategory = pool.get('cashbook.bookcategory')
MemCache = pool.get('cashbook.memcache')
at, = AccType.create([{
'name': 'depot',
@ -1044,7 +1106,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
[books[2].lines[1]],
{'quantity': Decimal('2.0'), 'amount': Decimal('3400.0')},
])
MemCache._cashbook_value_cache.clear_all()
self.prep_valstore_run_worker()
self.assertEqual(
books[0].rec_name,
@ -1070,11 +1132,19 @@ class ReportTestCase(CashbookInvestmentTestCase):
# evaluation: amount-difference
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'cashbooks_gldiff',
'dtype1': 'cashbooks_gldiff',
'dtype2': 'cashbooks_glvalue',
'dtype3': 'cashbooks_glyield',
'dtype4': 'cashbooks_glperc',
'dtype5': 'cashbooks',
'chart': 'hbar',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(evaluation.dtype, 'cashbooks_gldiff')
self.assertEqual(evaluation.dtype1, 'cashbooks_gldiff')
self.assertEqual(evaluation.dtype2, 'cashbooks_glvalue')
self.assertEqual(evaluation.dtype3, 'cashbooks_glyield')
self.assertEqual(evaluation.dtype4, 'cashbooks_glperc')
self.assertEqual(evaluation.dtype5, 'cashbooks')
self.assertEqual(evaluation.chart, 'hbar')
self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default')
@ -1082,23 +1152,51 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation.currency.code, 'EUR')
self.assertEqual(
evaluation.line_values[0].balance,
Decimal('857.14'))
evaluation.line_values[0].value1, Decimal('857.14'))
self.assertEqual(
evaluation.line_values[1].balance,
Decimal('476.19'))
evaluation.line_values[0].value2, Decimal('6666.67'))
self.assertEqual(
evaluation.line_values[2].balance,
Decimal('-33.33'))
evaluation.line_values[0].value3, Decimal('6666.67'))
self.assertEqual(
evaluation.line_values[0].value4, Decimal('14.75'))
self.assertEqual(
evaluation.line_values[0].value5, Decimal('5809.52'))
self.assertEqual(
evaluation.line_values[1].value1, Decimal('476.19'))
self.assertEqual(
evaluation.line_values[1].value2, Decimal('6666.67'))
self.assertEqual(
evaluation.line_values[1].value3, Decimal('6666.67'))
self.assertEqual(
evaluation.line_values[1].value4, Decimal('7.69'))
self.assertEqual(
evaluation.line_values[1].value5, Decimal('6190.48'))
self.assertEqual(
evaluation.line_values[2].value1, Decimal('-33.33'))
self.assertEqual(
evaluation.line_values[2].value2, Decimal('6666.67'))
self.assertEqual(
evaluation.line_values[2].value3, Decimal('6666.67'))
self.assertEqual(
evaluation.line_values[2].value4, Decimal('-0.50'))
self.assertEqual(
evaluation.line_values[2].value5, Decimal('6700.00'))
# evaluation: percent-difference
evaluation2, = Evaluation.create([{
'name': 'Evaluation 2',
'dtype': 'cashbooks_glperc',
'dtype1': 'cashbooks_glperc',
'chart': 'hbar',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(evaluation2.dtype, 'cashbooks_glperc')
self.assertEqual(evaluation2.dtype1, 'cashbooks_glperc')
self.assertEqual(evaluation2.dtype2, None)
self.assertEqual(evaluation2.dtype3, None)
self.assertEqual(evaluation2.dtype4, None)
self.assertEqual(evaluation2.dtype5, None)
self.assertEqual(evaluation2.chart, 'hbar')
self.assertEqual(evaluation2.legend, True)
self.assertEqual(evaluation2.maincolor, 'default')
@ -1106,23 +1204,20 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation2.currency.code, 'EUR')
self.assertEqual(
evaluation2.line_values[0].balance,
Decimal('14.75'))
evaluation2.line_values[0].value1, Decimal('14.75'))
self.assertEqual(
evaluation2.line_values[1].balance,
Decimal('7.69'))
evaluation2.line_values[1].value1, Decimal('7.69'))
self.assertEqual(
evaluation2.line_values[2].balance,
Decimal('-0.5'))
evaluation2.line_values[2].value1, Decimal('-0.5'))
# evaluation: percent-difference
evaluation3, = Evaluation.create([{
'name': 'Evaluation 3',
'dtype': 'cashbooks_glvalue',
'dtype1': 'cashbooks_glvalue',
'chart': 'hbar',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(evaluation3.dtype, 'cashbooks_glvalue')
self.assertEqual(evaluation3.dtype1, 'cashbooks_glvalue')
self.assertEqual(evaluation3.chart, 'hbar')
self.assertEqual(evaluation3.legend, True)
self.assertEqual(evaluation3.maincolor, 'default')
@ -1130,23 +1225,20 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation3.currency.code, 'EUR')
self.assertEqual(
evaluation3.line_values[0].balance,
Decimal('6666.67'))
evaluation3.line_values[0].value1, Decimal('6666.67'))
self.assertEqual(
evaluation3.line_values[1].balance,
Decimal('6666.67'))
evaluation3.line_values[1].value1, Decimal('6666.67'))
self.assertEqual(
evaluation3.line_values[2].balance,
Decimal('6666.67'))
evaluation3.line_values[2].value1, Decimal('6666.67'))
# evaluation: category-current value
evaluation4, = Evaluation.create([{
'name': 'Evaluation 4',
'dtype': 'category_glvalue',
'dtype1': 'categories_glvalue',
'chart': 'hbar',
'categories': [('add', [cb_cat.id])],
}])
self.assertEqual(evaluation4.dtype, 'category_glvalue')
self.assertEqual(evaluation4.dtype1, 'categories_glvalue')
self.assertEqual(evaluation4.chart, 'hbar')
self.assertEqual(evaluation4.legend, True)
self.assertEqual(evaluation4.maincolor, 'default')
@ -1155,17 +1247,16 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation4.line_values), 1)
self.assertEqual(
evaluation4.line_values[0].balance,
Decimal('20000.01'))
evaluation4.line_values[0].value1, Decimal('20000.01'))
# evaluation: category- difference amount
evaluation5, = Evaluation.create([{
'name': 'Evaluation 5',
'dtype': 'category_gldiff',
'dtype1': 'categories_gldiff',
'chart': 'hbar',
'categories': [('add', [cb_cat.id])],
}])
self.assertEqual(evaluation5.dtype, 'category_gldiff')
self.assertEqual(evaluation5.dtype1, 'categories_gldiff')
self.assertEqual(evaluation5.chart, 'hbar')
self.assertEqual(evaluation5.legend, True)
self.assertEqual(evaluation5.maincolor, 'default')
@ -1174,17 +1265,16 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation5.line_values), 1)
self.assertEqual(
evaluation5.line_values[0].balance,
Decimal('1300.01'))
evaluation5.line_values[0].value1, Decimal('1300.01'))
# evaluation: category- difference amount
evaluation6, = Evaluation.create([{
'name': 'Evaluation 6',
'dtype': 'category_glperc',
'dtype1': 'categories_glperc',
'chart': 'hbar',
'categories': [('add', [cb_cat.id])],
}])
self.assertEqual(evaluation6.dtype, 'category_glperc')
self.assertEqual(evaluation6.dtype1, 'categories_glperc')
self.assertEqual(evaluation6.chart, 'hbar')
self.assertEqual(evaluation6.legend, True)
self.assertEqual(evaluation6.maincolor, 'default')
@ -1193,8 +1283,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation6.line_values), 1)
self.assertEqual(
evaluation6.line_values[0].balance,
Decimal('6.95'))
evaluation6.line_values[0].value1, Decimal('6.95'))
@with_transaction()
def test_report_chart_pie_book_red(self):
@ -1212,7 +1301,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
'name': 'Evaluation 1',
'cashbooks': [('add', [x.id for x in books])],
}])
self.assertEqual(evaluation.dtype, 'cashbooks')
self.assertEqual(evaluation.dtype1, 'cashbooks')
self.assertEqual(evaluation.chart, 'pie')
self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default')
@ -1224,8 +1313,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation.ui_view_chart.model,
'cashbook_report.eval_line')
self.assertEqual(
evaluation.ui_view_chart.module,
'cashbook_report')
evaluation.ui_view_chart.module, 'cashbook_report')
self.assertEqual(evaluation.ui_view_chart.priority, 10)
self.assertEqual(evaluation.ui_view_chart.type, 'graph')
self.assertEqual(
@ -1236,55 +1324,43 @@ class ReportTestCase(CashbookInvestmentTestCase):
<field name="name"/>
</x>
<y>
<field name="balance" fill="1" empty="0" string="Cashbooks [Amount]"/>
<field name="value1" fill="1" empty="0" string="Cashbooks [Amount]"/>
</y>
</graph>
""")
self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual(
evaluation.cashbooks[0].rec_name,
'Book 1 | 25.00 usd | Open')
evaluation.cashbooks[0].rec_name, 'Book 1 | 25.00 usd | Open')
self.assertEqual(
evaluation.cashbooks[1].rec_name,
'Book 2 | 12.50 usd | Open')
evaluation.cashbooks[1].rec_name, 'Book 2 | 12.50 usd | Open')
self.assertEqual(
evaluation.cashbooks[2].rec_name,
'Book 3 | 23.00 € | Open')
evaluation.cashbooks[2].rec_name, 'Book 3 | 23.00 € | Open')
self.assertEqual(evaluation.cashbooks[0].currency.code, 'usd')
self.assertEqual(evaluation.cashbooks[1].currency.code, 'usd')
self.assertEqual(evaluation.cashbooks[2].currency.code, 'EUR')
self.assertEqual(len(evaluation.line_values), 3)
self.assertEqual(
evaluation.line_values[0].name,
'Book 1 | 25.00 usd | Open')
evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open')
self.assertEqual(
evaluation.line_values[1].name,
'Book 2 | 12.50 usd | Open')
evaluation.line_values[1].name, 'Book 2 | 12.50 usd | Open')
self.assertEqual(
evaluation.line_values[2].name,
'Book 3 | 23.00 € | Open')
evaluation.line_values[2].name, 'Book 3 | 23.00 € | Open')
self.assertEqual(
evaluation.line_values[0].eval_currency.code,
'EUR')
evaluation.line_values[0].eval_currency.code, 'EUR')
self.assertEqual(
evaluation.line_values[1].eval_currency.code,
'EUR')
evaluation.line_values[1].eval_currency.code, 'EUR')
self.assertEqual(
evaluation.line_values[2].eval_currency.code,
'EUR')
evaluation.line_values[2].eval_currency.code, 'EUR')
self.assertEqual(
evaluation.line_values[0].balance,
Decimal('23.81'))
evaluation.line_values[0].value1, Decimal('23.81'))
self.assertEqual(
evaluation.line_values[1].balance,
Decimal('11.90'))
evaluation.line_values[1].value1, Decimal('11.90'))
self.assertEqual(
evaluation.line_values[2].balance,
Decimal('23.00'))
evaluation.line_values[2].value1, Decimal('23.00'))
@with_transaction()
def test_report_chart_pie_type_red(self):
@ -1303,10 +1379,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
'date': date(2022, 5, 15)}):
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'types',
'dtype1': 'types',
'types': [('add', [x.id for x in Types.search([])])],
}])
self.assertEqual(evaluation.dtype, 'types')
self.assertEqual(evaluation.dtype1, 'types')
self.assertEqual(evaluation.chart, 'pie')
self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default')
@ -1323,21 +1399,17 @@ class ReportTestCase(CashbookInvestmentTestCase):
# 23.00 EUR
self.assertEqual(
evaluation.line_values[0].eval_currency.code,
'EUR')
evaluation.line_values[0].eval_currency.code, 'EUR')
self.assertEqual(evaluation.line_values[0].name, 'BK - Bank')
self.assertEqual(
evaluation.line_values[0].balance,
Decimal('23.0'))
evaluation.line_values[0].value1, Decimal('23.0'))
# 37.50 USD --> EUR
self.assertEqual(evaluation.line_values[1].name, 'CAS - Cash')
self.assertEqual(
evaluation.line_values[1].eval_currency.code,
'EUR')
evaluation.line_values[1].eval_currency.code, 'EUR')
self.assertEqual(
evaluation.line_values[1].balance,
Decimal('35.71'))
evaluation.line_values[1].value1, Decimal('35.71'))
@with_transaction()
def test_report_chart_pie_currency_red(self):
@ -1355,10 +1427,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
'company': company.id}):
evaluation, = Evaluation.create([{
'name': 'Evaluation 1',
'dtype': 'currencies',
'dtype1': 'currencies',
'currencies': [('add', [x.id for x in Currency.search([])])],
}])
self.assertEqual(evaluation.dtype, 'currencies')
self.assertEqual(evaluation.dtype1, 'currencies')
self.assertEqual(evaluation.chart, 'pie')
self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default')
@ -1372,12 +1444,15 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation.line_values), 2)
self.assertEqual(evaluation.line_values[0].name, 'Euro')
self.assertEqual(
evaluation.line_values[0].balance,
Decimal('23.0'))
evaluation.line_values[0].value1, Decimal('23.0'))
self.assertEqual(evaluation.line_values[1].name, 'usd')
self.assertEqual(
evaluation.line_values[1].balance,
Decimal('35.71'))
evaluation.line_values[1].value1, Decimal('35.71'))
self.assertEqual(evaluation.line_values[0].value2, None)
self.assertEqual(evaluation.line_values[0].value3, None)
self.assertEqual(evaluation.line_values[0].value4, None)
self.assertEqual(evaluation.line_values[0].value5, None)
# end ReportTestCase

View file

@ -5,7 +5,19 @@ full copyright notices and license terms. -->
<form>
<label name="name"/>
<field name="name"/>
<label name="balance"/>
<field name="balance"/>
<field name="name_line"/>
<newline/>
<label name="value1"/>
<field name="value1"/>
<label name="value2"/>
<field name="value2"/>
<label name="value3"/>
<field name="value3"/>
<label name="value4"/>
<field name="value4"/>
<label name="value5"/>
<field name="value5"/>
</form>

View file

@ -7,6 +7,6 @@ full copyright notices and license terms. -->
<field name="name"/>
</x>
<y>
<field name="balance" fill="1" empty="0"/>
<field name="value1" fill="1" empty="0"/>
</y>
</graph>

View file

@ -4,5 +4,9 @@ The COPYRIGHT file at the top level of this repository contains the
full copyright notices and license terms. -->
<tree >
<field name="name"/>
<field name="balance"/>
<field name="value1"/>
<field name="value2"/>
<field name="value3"/>
<field name="value4"/>
<field name="value5"/>
</tree>

View file

@ -5,10 +5,23 @@ full copyright notices and license terms. -->
<form col="6">
<label name="name"/>
<field name="name"/>
<label name="dtype"/>
<field name="dtype"/>
<label name="currency"/>
<field name="currency"/>
<newline/>
<separator colspan="6" id="sepdtype" string="Type of data displayed"/>
<label name="dtype1"/>
<field name="dtype1"/>
<label name="dtype2"/>
<field name="dtype2"/>
<label name="dtype3"/>
<field name="dtype3"/>
<label name="dtype4"/>
<field name="dtype4"/>
<label name="dtype5"/>
<field name="dtype5"/>
<newline/>
<separator colspan="6" id="sepdisplay" string="Representation"/>
<label name="chart"/>

View file

@ -4,7 +4,11 @@ The COPYRIGHT file at the top level of this repository contains the
full copyright notices and license terms. -->
<tree keyword_open="1" sequence="sequence">
<field name="name"/>
<field name="dtype"/>
<field name="dtype1"/>
<field name="dtype2" optional="0"/>
<field name="dtype3" optional="1"/>
<field name="dtype4" optional="1"/>
<field name="dtype5" optional="1"/>
<field name="chart"/>
<field name="legend"/>
<field name="maincolor"/>