Multiple Data Sources in Evaluations

This commit is contained in:
Frederik Jaeckel 2024-01-13 15:08:20 +01:00
parent 115204bd2e
commit 8ddfba3179
13 changed files with 952 additions and 382 deletions

View file

@ -3,14 +3,17 @@
# The COPYRIGHT file at the top level of this repository contains the # The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms. # full copyright notices and license terms.
from sql.conditionals import Case
from trytond.model import ModelView, ModelSQL, fields, sequence_ordered 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.transaction import Transaction
from trytond.pool import Pool from trytond.pool import Pool
from trytond.i18n import gettext from trytond.i18n import gettext
from trytond.exceptions import UserError
from .colors import sel_color as sel_bgcolor from .colors import sel_color as sel_bgcolor
from .templates import template_view_graph, template_view_line, \ from .templates import (
cashbook_types, category_types, booktype_types template_view_graph, template_view_line, cashbook_types,
category_types, booktype_types, currency_types)
sel_chart = [ sel_chart = [
@ -39,10 +42,41 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
string='Company', model_name='company.company', string='Company', model_name='company.company',
required=True, ondelete="RESTRICT") required=True, ondelete="RESTRICT")
name = fields.Char(string='Name', required=True) 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') 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( chart = fields.Selection(
string='Chart type', required=True, sort=False, string='Chart type', required=True, sort=False,
selection=sel_chart, help='Type of graphical presentation.') selection=sel_chart, help='Type of graphical presentation.')
@ -62,24 +96,24 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
cashbooks = fields.Many2Many( cashbooks = fields.Many2Many(
string='Cashbooks', relation_name='cashbook_report.eval_line', string='Cashbooks', relation_name='cashbook_report.eval_line',
origin='evaluation', target='cashbook', origin='evaluation', target='cashbook',
states={'invisible': ~Eval('dtype', '').in_(cashbook_types)}, states={'invisible': ~Eval('dtype1', '').in_(cashbook_types)},
depends=['dtype']) depends=['dtype1'])
types = fields.Many2Many( types = fields.Many2Many(
string='Types', relation_name='cashbook_report.eval_line', string='Types', relation_name='cashbook_report.eval_line',
origin='evaluation', target='dtype', origin='evaluation', target='dtype',
states={'invisible': ~Eval('dtype', '').in_(booktype_types)}, states={'invisible': ~Eval('dtype1', '').in_(booktype_types)},
depends=['dtype']) depends=['dtype1'])
currencies = fields.Many2Many( currencies = fields.Many2Many(
string='Currencies', relation_name='cashbook_report.eval_line', string='Currencies', relation_name='cashbook_report.eval_line',
origin='evaluation', target='currency', origin='evaluation', target='currency',
filter=[('cashbook_hasbookings', '=', True)], filter=[('cashbook_hasbookings', '=', True)],
states={'invisible': Eval('dtype', '') != 'currencies'}, states={'invisible': Eval('dtype1', '') != 'currencies'},
depends=['dtype']) depends=['dtype1'])
categories = fields.Many2Many( categories = fields.Many2Many(
string='Categories', relation_name='cashbook_report.eval_line', string='Categories', relation_name='cashbook_report.eval_line',
origin='evaluation', target='category', origin='evaluation', target='category',
states={'invisible': ~Eval('dtype', '').in_(category_types)}, states={'invisible': ~Eval('dtype1', '').in_(category_types)},
depends=['dtype']) depends=['dtype1'])
line_values = fields.One2Many( line_values = fields.One2Many(
string='Line Values', field='evaluation', readonly=True, 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', string='Dashboard View', model_name='ir.action.act_window.view',
ondelete='SET NULL') 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 @classmethod
def default_currency(cls): def default_currency(cls):
""" currency of company """ currency of company
@ -129,11 +189,94 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
return True return True
@classmethod @classmethod
def default_dtype(cls): def default_dtype1(cls):
""" default 'book' """ default 'book'
""" """
return 'cashbooks' 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 @classmethod
def default_chart(cls): def default_chart(cls):
""" default 'pie' """ default 'pie'
@ -144,18 +287,42 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
def get_sel_etype(cls): def get_sel_etype(cls):
""" get list of evaluation-types """ get list of evaluation-types
""" """
return [ result = [('', '-/-')]
('cashbooks', gettext('cashbook_report.msg_dtype_cashbook')), result.extend([
('types', gettext('cashbook_report.msg_dtype_type')), (x, gettext('cashbook_report.msg_dtype_%s' % x))
('currencies', gettext('cashbook_report.msg_dtype_currency')), for x in ['cashbooks', 'types', 'currencies', 'categories']])
('categories', gettext('cashbook_report.msg_dtype_category')), 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 @classmethod
def get_create_view_data(cls, evaluation): def get_create_view_data(cls, evaluation):
""" generate dictionary to create view-xml """ 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', 'model': 'cashbook_report.eval_line',
'module': 'cashbook_report', 'module': 'cashbook_report',
'priority': 10, 'priority': 10,
@ -167,9 +334,13 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
'type': evaluation.chart, 'type': evaluation.chart,
'colscheme': '' if evaluation.maincolor == 'default' 'colscheme': '' if evaluation.maincolor == 'default'
else 'color="%s"' % evaluation.maincolor, else 'color="%s"' % evaluation.maincolor,
'lines': template_view_line % { 'lines': '\n'.join([
'fill': '1', template_view_line % {
'string': evaluation.dtype_string}}} 'fill': '1',
'fname': x['fname'],
'string': x['name']}
for x in dtypes])}}
return result
@classmethod @classmethod
def uiview_delete(cls, evaluations): def uiview_delete(cls, evaluations):
@ -221,7 +392,8 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
'name': evaluation.name, 'name': evaluation.name,
'res_model': 'cashbook_report.eval_line', 'res_model': 'cashbook_report.eval_line',
'usage': 'dashboard', 'usage': 'dashboard',
'context_domain': '[["evaluation", "=", %d]]' % evaluation.id, 'context_domain': '[["evaluation", "=", %d]]' % (
evaluation.id),
}]) }])
dashb_actview, = ActView.create([{ dashb_actview, = ActView.create([{
@ -253,12 +425,51 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
if len(to_write_dbaction) > 0: if len(to_write_dbaction) > 0:
DashboardAction.write(*to_write_dbaction) DashboardAction.write(*to_write_dbaction)
cls.uiview_delete(evaluations) cls.uiview_delete(evaluations)
if len(to_write_eval) > 0: if len(to_write_eval) > 0:
Evaluation2.write(*to_write_eval) 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 @classmethod
def create(cls, vlist): def create(cls, vlist):
""" add chart """ add chart
@ -269,37 +480,48 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView):
@classmethod @classmethod
def write(cls, *args): def write(cls, *args):
""" unlink records if dtype changes """ unlink records if dtypex changes
""" """
to_write = [] to_write = []
to_update_uiview = [] to_update_uiview = []
dtypes = {'dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5'}
actions = iter(args) actions = iter(args)
for evaluations, values in zip(actions, actions): for evaluations, values in zip(actions, actions):
# update ui-view if related fields change # update ui-view if related fields change
if len(set({ uiview_fields = {
'name', 'dtype', 'bgcolor', 'maincolor', 'name', 'bgcolor', 'maincolor', 'legend', 'chart'}
'legend', 'chart'}).intersection(values.keys())) > 0: uiview_fields.update(dtypes)
if uiview_fields.intersection(values.keys()):
to_update_uiview.extend(evaluations) to_update_uiview.extend(evaluations)
# unlink records if dtype changes # unlink records if dtype(x) changes
if 'dtype' in values.keys(): if set(values.keys()).intersection(dtypes):
for evaluation in evaluations: 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 continue
dtype1 = values.get('dtype1', evaluation.dtype1)
for dt in [ for dt in [
'cashbooks', 'types', 'currencies', 'cashbooks', 'types', 'currencies',
'categories']: 'categories']:
if (not values['dtype'].startswith(dt)) and \ if dtype1.startswith(dt):
(len(getattr(evaluation, dt)) > 0): continue
to_write.extend([
[evaluation], lines = getattr(evaluation, dt)
{ if not lines:
dt: [('remove', [ continue
x.id for x in getattr(
evaluation, dt)])], to_write.extend([
}]) [evaluation],
{
dt: [('remove', [x.id for x in lines])],
}])
args = list(args) args = list(args)
args.extend(to_write) args.extend(to_write)

View file

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

194
line.py
View file

@ -6,7 +6,7 @@
from decimal import Decimal from decimal import Decimal
from sql.aggregate import Sum from sql.aggregate import Sum
from trytond.model import ModelView, ModelSQL, fields 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.transaction import Transaction
from trytond.i18n import gettext from trytond.i18n import gettext
from trytond.exceptions import UserError from trytond.exceptions import UserError
@ -24,28 +24,36 @@ class EvaluationLine(ModelSQL, ModelView):
cashbook = fields.Many2One( cashbook = fields.Many2One(
string='Cashbook', ondelete='CASCADE', model_name='cashbook.book', string='Cashbook', ondelete='CASCADE', model_name='cashbook.book',
states={ states={
'required': Eval('eval_dtype', '').in_(cashbook_types), 'required': Eval('eval_dtype1', '').in_(cashbook_types),
}, depends=['eval_dtype']) }, depends=['eval_dtype1'])
dtype = fields.Many2One( dtype = fields.Many2One(
string='Type', ondelete='CASCADE', model_name='cashbook.type', string='Type', ondelete='CASCADE', model_name='cashbook.type',
states={ states={
'required': Eval('eval_dtype', '').in_(booktype_types), 'required': Eval('eval_dtype1', '').in_(booktype_types),
}, depends=['eval_dtype']) }, depends=['eval_dtype1'])
currency = fields.Many2One( currency = fields.Many2One(
string='Currency', ondelete='CASCADE', model_name='currency.currency', string='Currency', ondelete='CASCADE', model_name='currency.currency',
states={ states={
'required': Eval('eval_dtype', '') == 'currencies', 'required': Eval('eval_dtype1', '') == 'currencies',
}, depends=['eval_dtype']) }, depends=['eval_dtype1'])
category = fields.Many2One( category = fields.Many2One(
string='Category', ondelete='CASCADE', string='Category', ondelete='CASCADE',
model_name='cashbook.bookcategory', model_name='cashbook.bookcategory',
states={ states={
'required': Eval('eval_dtype', '').in_(category_types), 'required': Eval('eval_dtype1', '').in_(category_types),
}, depends=['eval_dtype']) }, depends=['eval_dtype1'])
# dtype + currency of evaluation # dtypes + currency of evaluation
eval_dtype = fields.Function(fields.Char( eval_dtype1 = fields.Function(fields.Char(
string='Data type', readonly=True), 'on_change_with_eval_dtype') 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( eval_currency = fields.Function(fields.Many2One(
model_name='currency.currency', model_name='currency.currency',
string="Currency", readonly=True), 'on_change_with_eval_currency') string="Currency", readonly=True), 'on_change_with_eval_currency')
@ -56,11 +64,35 @@ class EvaluationLine(ModelSQL, ModelView):
name = fields.Function(fields.Char( name = fields.Function(fields.Char(
string='Name'), 'on_change_with_name', setter='set_name_data') string='Name'), 'on_change_with_name', setter='set_name_data')
name_line = fields.Char(string='Name', states={'invisible': True}) name_line = fields.Char(string='Name', states={'invisible': True})
balance = fields.Function(fields.Numeric( value1 = fields.Function(fields.Numeric(
string='Balance', string='Value 1',
readonly=True, digits=(16, Eval('currency_digits', 2)), readonly=True, digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits']), 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 @classmethod
def set_name_data(cls, lines, name, value): def set_name_data(cls, lines, name, value):
@ -94,12 +126,40 @@ class EvaluationLine(ModelSQL, ModelView):
return super(EvaluationLine, cls).fields_view_get( return super(EvaluationLine, cls).fields_view_get(
view_id=view_id, view_type=view_type) view_id=view_id, view_type=view_type)
@fields.depends('evaluation', '_parent_evaluation.dtype') @fields.depends('evaluation', '_parent_evaluation.dtype1')
def on_change_with_eval_dtype(self, name=None): def on_change_with_eval_dtype1(self, name=None):
""" get dtype from parent """ get dtype1 from parent
""" """
if self.evaluation: 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') @fields.depends('evaluation', '_parent_evaluation.currency')
def on_change_with_eval_currency(self, name=None): def on_change_with_eval_currency(self, name=None):
@ -118,7 +178,7 @@ class EvaluationLine(ModelSQL, ModelView):
return 2 return 2
@fields.depends( @fields.depends(
'eval_dtype', 'category', 'cashbook', 'dtype', 'currency', 'eval_dtype1', 'category', 'cashbook', 'dtype', 'currency',
'name_line') 'name_line')
def on_change_with_name(self, name=None): def on_change_with_name(self, name=None):
""" get name of Type """ get name of Type
@ -129,14 +189,14 @@ class EvaluationLine(ModelSQL, ModelView):
return self.name_line return self.name_line
# otherwise use rec_name of linked record # otherwise use rec_name of linked record
if self.eval_dtype: if self.eval_dtype1:
dtype_sel = {'currencies': 'currency'} dtype_sel = {'currencies': 'currency'}
dtype_sel.update({x: 'cashbook' for x in cashbook_types}) dtype_sel.update({x: 'cashbook' for x in cashbook_types})
dtype_sel.update({x: 'category' for x in category_types}) dtype_sel.update({x: 'category' for x in category_types})
dtype_sel.update({x: 'dtype' for x in booktype_types}) dtype_sel.update({x: 'dtype' for x in booktype_types})
return getattr( return getattr(
getattr(self, dtype_sel[self.eval_dtype], None), getattr(self, dtype_sel[self.eval_dtype1], None),
'rec_name', None) 'rec_name', None)
def convert_to_evalcurrency(self, from_currency, amount): def convert_to_evalcurrency(self, from_currency, amount):
@ -156,28 +216,28 @@ class EvaluationLine(ModelSQL, ModelView):
""" """
super(EvaluationLine, cls).validate(records) super(EvaluationLine, cls).validate(records)
for record in 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): (record.cashbook is not None):
raise UserError(gettext( raise UserError(gettext(
'cashbook_report.msg_invalid_dtype', 'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_cashbook'))) typename=gettext('cashbook_report.msg_dtype_cashbooks')))
if (record.evaluation.dtype not in booktype_types) and \ if (record.evaluation.dtype1 not in booktype_types) and \
(record.dtype is not None): (record.dtype is not None):
raise UserError(gettext( raise UserError(gettext(
'cashbook_report.msg_invalid_dtype', 'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_type'))) typename=gettext('cashbook_report.msg_dtype_types')))
if (record.evaluation.dtype != 'currencies') and \ if (record.evaluation.dtype1 != 'currencies') and \
(record.currency is not None): (record.currency is not None):
raise UserError(gettext( raise UserError(gettext(
'cashbook_report.msg_invalid_dtype', 'cashbook_report.msg_invalid_dtype',
typename=gettext('cashbook_report.msg_dtype_currency'))) typename=gettext('cashbook_report.msg_dtype_currencies')))
if (record.evaluation.dtype not in category_types) and \ if (record.evaluation.dtype1 not in category_types) and \
(record.category is not None): (record.category is not None):
raise UserError(gettext( raise UserError(gettext(
'cashbook_report.msg_invalid_dtype', '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 """ run 'query' on Lines, convert used
currencies to evaluation-currency currencies to evaluation-currency
""" """
@ -205,10 +265,10 @@ class EvaluationLine(ModelSQL, ModelView):
Sum(tab_line.credit - tab_line.debit).as_('balance'), Sum(tab_line.credit - tab_line.debit).as_('balance'),
group_by=[tab_book.currency]) group_by=[tab_book.currency])
cursor.execute(*query) cursor.execute(*query)
balances = cursor.fetchall() records = cursor.fetchall()
for balance in balances: for record in records:
(id_currency, bal1) = balance (id_currency, bal1) = record
if bal1 is not None: if bal1 is not None:
total_amount += self.convert_to_evalcurrency( total_amount += self.convert_to_evalcurrency(
@ -231,7 +291,7 @@ class EvaluationLine(ModelSQL, ModelView):
if self.category is None: if self.category is None:
return None return None
return self.get_balance_by_query([ return self.get_value_by_query([
('cashbook.categories.id', '=', self.category.id), ('cashbook.categories.id', '=', self.category.id),
('cashbook.state', '=', 'open'), ('cashbook.state', '=', 'open'),
('date', '<=', IrDate.today())]) ('date', '<=', IrDate.today())])
@ -245,7 +305,7 @@ class EvaluationLine(ModelSQL, ModelView):
if self.dtype is None: if self.dtype is None:
return None return None
return self.get_balance_by_query([ return self.get_value_by_query([
('cashbook.btype.id', '=', self.dtype.id), ('cashbook.btype.id', '=', self.dtype.id),
('cashbook.state', '=', 'open'), ('cashbook.state', '=', 'open'),
('date', '<=', IrDate.today())]) ('date', '<=', IrDate.today())])
@ -259,22 +319,74 @@ class EvaluationLine(ModelSQL, ModelView):
if self.currency is None: if self.currency is None:
return None return None
return self.get_balance_by_query([ return self.get_value_by_query([
('cashbook.currency.id', '=', self.currency.id), ('cashbook.currency.id', '=', self.currency.id),
('cashbook.state', '=', 'open'), ('cashbook.state', '=', 'open'),
('date', '<=', IrDate.today())]) ('date', '<=', IrDate.today())])
@fields.depends( @fields.depends(
'eval_dtype', 'eval_currency', 'currency_digits', 'eval_dtype1', 'eval_currency', 'currency_digits',
'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance', 'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance',
'category', '_parent_category.id', 'category', '_parent_category.id',
'evaluation', '_parent_evaluation.id', 'dtype', 'currency') '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 """ balance of cashbook
""" """
if (self.evaluation is None) or (self.eval_currency is None) or \ 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 None
return getattr(self, 'get_value_%s' % self.eval_dtype)() return getattr(self, 'get_value_%s' % self.eval_dtype5)()
# end EvaluationLine # end EvaluationLine

View file

@ -10,15 +10,15 @@ msgctxt "model:ir.message,text:msg_name_cashbook"
msgid "Type of evaluation must be '%(typename)s'." msgid "Type of evaluation must be '%(typename)s'."
msgstr "Typ der Auswertung mus '%(typename)s' sein." 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]" msgid "Cashbooks [Amount]"
msgstr "Kassenbücher [Betrag]" 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]" msgid "Cashbooks [Amount of Profit/Loss]"
msgstr "Kassenbücher [Betrag Gewinn/Verlust]" 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]" msgid "Cashbooks [Percent of Profit/Loss]"
msgstr "Kassenbücher [Prozent Gewinn/Verlust]" msgstr "Kassenbücher [Prozent Gewinn/Verlust]"
@ -30,7 +30,7 @@ msgctxt "model:ir.message,text:msg_dtype_cashbooks_glyield"
msgid "Cashbooks [Total Yield]" msgid "Cashbooks [Total Yield]"
msgstr "Kassenbücher [Gesamtertrag]" 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]" msgid "Types of Cashbooks [Amount]"
msgstr "Typen von Kassenbüchern [Betrag]" 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]" msgid "Types of Cashbooks [Total Yield]"
msgstr "Typen von Kassenbüchern [Gesamtertrag]" msgstr "Typen von Kassenbüchern [Gesamtertrag]"
msgctxt "model:ir.message,text:msg_dtype_currency" msgctxt "model:ir.message,text:msg_dtype_currencies"
msgid "Currencies" msgid "Currencies"
msgstr "Währungen" msgstr "Währungen"
msgctxt "model:ir.message,text:msg_dtype_category" msgctxt "model:ir.message,text:msg_dtype_categories"
msgid "Categories [Amount]" msgid "Categories [Amount]"
msgstr "Kategorien [Betrag]" 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]" msgid "Categories [Amount of Profit/Loss]"
msgstr "Kategorien [Betrag Gewinn/Verlust]" 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]" msgid "Categories [Current Value]"
msgstr "Kategorien [aktueller Wert]" 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]" msgid "Categories [Percent of Profit/Loss]"
msgstr "Kategorien [Prozent Gewinn/Verlust]" 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]" msgid "Categories [Total Yield]"
msgstr "Kategorien [Gesamtertrag]" msgstr "Kategorien [Gesamtertrag]"
@ -78,6 +78,14 @@ msgctxt "model:ir.message,text:msg_name_graph"
msgid "Graph: %(gname)s" msgid "Graph: %(gname)s"
msgstr "Diagramm: %(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 # # ir.rule.group #
@ -134,17 +142,49 @@ msgctxt "field:cashbook_report.eval_line,currency_digits:"
msgid "Currency Digits" msgid "Currency Digits"
msgstr "Nachkommastellen Währung" msgstr "Nachkommastellen Währung"
msgctxt "field:cashbook_report.eval_line,eval_dtype:" msgctxt "field:cashbook_report.eval_line,eval_dtype1:"
msgid "Data type" msgid "Data type 1"
msgstr "Datenart" 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:" msgctxt "field:cashbook_report.eval_line,name:"
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
msgctxt "field:cashbook_report.eval_line,balance:" msgctxt "field:cashbook_report.eval_line,value1:"
msgid "Balance" msgid "Value 1"
msgstr "Saldo" 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" msgid "Representation"
msgstr "Darstellung" msgstr "Darstellung"
msgctxt "view:cashbook_report.evaluation:"
msgid "Type of data displayed"
msgstr "Art der dargestellten Daten"
msgctxt "field:cashbook_report.evaluation,name:" msgctxt "field:cashbook_report.evaluation,name:"
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
msgctxt "field:cashbook_report.evaluation,dtype:" msgctxt "field:cashbook_report.evaluation,dtype1:"
msgid "Data type" msgid "Data type 1"
msgstr "Datenart" msgstr "Datenart 1"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "help:cashbook_report.evaluation,dtype1:"
msgid "Cashbooks" msgid "Type of data displayed"
msgstr "Kassenbücher" msgstr "Art der dargestellten Daten"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "field:cashbook_report.evaluation,dtype2:"
msgid "Types of Cashbooks" msgid "Data type 2"
msgstr "Typen von Kassenbüchern" msgstr "Datenart 2"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "help:cashbook_report.evaluation,dtype2:"
msgid "Currencys" msgid "Type of data displayed"
msgstr "Währungen" msgstr "Art der dargestellten Daten"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "field:cashbook_report.evaluation,dtype3:"
msgid "Categories" msgid "Data type 3"
msgstr "Kategorien" 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" msgid "Type of data displayed"
msgstr "Art der dargestellten Daten" 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'." msgid "Type of evaluation must be '%(typename)s'."
msgstr "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]" msgid "Cashbooks [Amount]"
msgstr "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]" msgid "Cashbooks [Amount of Profit/Loss]"
msgstr "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]" msgid "Cashbooks [Percent of Profit/Loss]"
msgstr "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]" msgid "Cashbooks [Total Yield]"
msgstr "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]" msgid "Types of Cashbooks [Amount]"
msgstr "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]" msgid "Types of Cashbooks [Total Yield]"
msgstr "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" msgid "Currencies"
msgstr "Currencies" msgstr "Currencies"
msgctxt "model:ir.message,text:msg_dtype_category" msgctxt "model:ir.message,text:msg_dtype_categories"
msgid "Categories [Amount]" msgid "Categories [Amount]"
msgstr "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]" msgid "Categories [Amount of Profit/Loss]"
msgstr "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]" msgid "Categories [Current Value]"
msgstr "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]" msgid "Categories [Percent of Profit/Loss]"
msgstr "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]" msgid "Categories [Total Yield]"
msgstr "Categories [Total Yield]" msgstr "Categories [Total Yield]"
@ -74,6 +74,14 @@ msgctxt "model:ir.message,text:msg_name_graph"
msgid "Graph: %(gname)s" msgid "Graph: %(gname)s"
msgstr "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" msgctxt "model:ir.rule.group,name:rg_eval_write_adm"
msgid "Administrators: Evaluation read/write" msgid "Administrators: Evaluation read/write"
msgstr "Administrators: Evaluation read/write" msgstr "Administrators: Evaluation read/write"
@ -118,17 +126,49 @@ msgctxt "field:cashbook_report.eval_line,currency_digits:"
msgid "Currency Digits" msgid "Currency Digits"
msgstr "Currency Digits" msgstr "Currency Digits"
msgctxt "field:cashbook_report.eval_line,eval_dtype:" msgctxt "field:cashbook_report.eval_line,eval_dtype1:"
msgid "Data type" msgid "Data type 1"
msgstr "Data type" 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:" msgctxt "field:cashbook_report.eval_line,name:"
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
msgctxt "field:cashbook_report.eval_line,balance:" msgctxt "field:cashbook_report.eval_line,value1:"
msgid "Balance" msgid "Value 1"
msgstr "Balance" 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:" msgctxt "model:cashbook_report.evaluation,name:"
msgid "Evaluation" msgid "Evaluation"
@ -146,31 +186,51 @@ msgctxt "view:cashbook_report.evaluation:"
msgid "Representation" msgid "Representation"
msgstr "Representation" msgstr "Representation"
msgctxt "view:cashbook_report.evaluation:"
msgid "Type of data displayed"
msgstr "Type of data displayed"
msgctxt "field:cashbook_report.evaluation,name:" msgctxt "field:cashbook_report.evaluation,name:"
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
msgctxt "field:cashbook_report.evaluation,dtype:" msgctxt "field:cashbook_report.evaluation,dtype1:"
msgid "Data type" msgid "Data type 1"
msgstr "Data type" msgstr "Data type 1"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "help:cashbook_report.evaluation,dtype1:"
msgid "Cashbooks" msgid "Type of data displayed"
msgstr "Cashbooks" msgstr "Type of data displayed"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "field:cashbook_report.evaluation,dtype2:"
msgid "Types of Cashbooks" msgid "Data type 2"
msgstr "Types of Cashbooks" msgstr "Data type 2"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "help:cashbook_report.evaluation,dtype2:"
msgid "Currencys" msgid "Type of data displayed"
msgstr "Currencys" msgstr "Type of data displayed"
msgctxt "selection:cashbook_report.evaluation,dtype:" msgctxt "field:cashbook_report.evaluation,dtype3:"
msgid "Categories" msgid "Data type 3"
msgstr "Categories" 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" msgid "Type of data displayed"
msgstr "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"> <record model="ir.message" id="msg_invalid_dtype">
<field name="text">Type of evaluation must be '%(typename)s'.</field> <field name="text">Type of evaluation must be '%(typename)s'.</field>
</record> </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> <field name="text">Cashbooks [Amount]</field>
</record> </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> <field name="text">Cashbooks [Amount of Profit/Loss]</field>
</record> </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> <field name="text">Cashbooks [Percent of Profit/Loss]</field>
</record> </record>
<record model="ir.message" id="msg_dtype_cashbooks_glvalue"> <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"> <record model="ir.message" id="msg_dtype_cashbooks_glyield">
<field name="text">Cashbooks [Total Yield]</field> <field name="text">Cashbooks [Total Yield]</field>
</record> </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> <field name="text">Types of Cashbooks [Amount]</field>
</record> </record>
<record model="ir.message" id="msg_dtype_types_gldiff"> <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"> <record model="ir.message" id="msg_dtype_types_glyield">
<field name="text">Types of Cashbooks [Total Yield]</field> <field name="text">Types of Cashbooks [Total Yield]</field>
</record> </record>
<record model="ir.message" id="msg_dtype_currency"> <record model="ir.message" id="msg_dtype_currencies">
<field name="text">Currencies</field> <field name="text">Currencies</field>
</record> </record>
<record model="ir.message" id="msg_dtype_category"> <record model="ir.message" id="msg_dtype_categories">
<field name="text">Categories [Amount]</field> <field name="text">Categories [Amount]</field>
</record> </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> <field name="text">Categories [Amount of Profit/Loss]</field>
</record> </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> <field name="text">Categories [Current Value]</field>
</record> </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> <field name="text">Categories [Percent of Profit/Loss]</field>
</record> </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> <field name="text">Categories [Total Yield]</field>
</record> </record>
<record model="ir.message" id="msg_name_graph"> <record model="ir.message" id="msg_name_graph">
<field name="text">Graph: %(gname)s</field> <field name="text">Graph: %(gname)s</field>
</record> </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> </data>
</tryton> </tryton>

View file

@ -7,13 +7,14 @@ cashbook_types = [
'cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc', 'cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc',
'cashbooks_glvalue', 'cashbooks_glyield'] 'cashbooks_glvalue', 'cashbooks_glyield']
category_types = [ category_types = [
'categories', 'category_gldiff', 'category_glvalue', 'categories', 'categories_gldiff', 'categories_glvalue',
'category_glperc', 'category_glyield'] 'categories_glperc', 'categories_glyield']
booktype_types = [ booktype_types = [
'types', 'types_gldiff', 'types_glvalue', 'types', 'types_gldiff', 'types_glvalue',
'types_glperc', 'types_glyield'] '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"/>' 'empty="0" string="%(string)s"/>'
template_view_graph = """<?xml version="1.0"?> template_view_graph = """<?xml version="1.0"?>

View file

@ -3,14 +3,17 @@
# The COPYRIGHT file at the top level of this repository contains the # The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms. # 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.tests.test_tryton import with_transaction, activate_module
from trytond.pool import Pool from trytond.pool import Pool
from trytond.transaction import Transaction from trytond.transaction import Transaction
from trytond.exceptions import UserError from trytond.exceptions import UserError
from trytond.i18n import gettext
from trytond.modules.cashbook_investment.tests.test_module import \ from trytond.modules.cashbook_investment.tests.test_module import \
CashbookInvestmentTestCase CashbookInvestmentTestCase
from datetime import date from trytond.modules.cashbook_report.templates import (
from decimal import Decimal cashbook_types, category_types, booktype_types, currency_types)
class ReportTestCase(CashbookInvestmentTestCase): class ReportTestCase(CashbookInvestmentTestCase):
@ -136,6 +139,21 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(books[2].balance, Decimal('23.0')) self.assertEqual(books[2].balance, Decimal('23.0'))
return books 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() @with_transaction()
def test_report_currency_hasbookings(self): def test_report_currency_hasbookings(self):
""" check detectpn of bookings @ currency """ check detectpn of bookings @ currency
@ -254,7 +272,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation1, = Evaluation.create([{ evaluation1, = Evaluation.create([{
'name': 'Evaluation User 1 - Cashbooks', 'name': 'Evaluation User 1 - Cashbooks',
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books_owner1])], 'cashbooks': [('add', [x.id for x in books_owner1])],
}]) }])
self.assertEqual(len(evaluation1.cashbooks), 2) self.assertEqual(len(evaluation1.cashbooks), 2)
@ -264,18 +282,16 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation1.line_values[0].name, evaluation1.line_values[0].name,
'Book 1 | 25.00 usd | Open') 'Book 1 | 25.00 usd | Open')
self.assertEqual( self.assertEqual(
evaluation1.line_values[0].balance, evaluation1.line_values[0].value1, Decimal('23.81'))
Decimal('23.81'))
self.assertEqual( self.assertEqual(
evaluation1.line_values[1].name, evaluation1.line_values[1].name,
'Book 2 | 12.50 usd | Open') 'Book 2 | 12.50 usd | Open')
self.assertEqual( self.assertEqual(
evaluation1.line_values[1].balance, evaluation1.line_values[1].value1, Decimal('11.9'))
Decimal('11.9'))
evaluation2, = Evaluation.create([{ evaluation2, = Evaluation.create([{
'name': 'Evaluation User 1 - Types', 'name': 'Evaluation User 1 - Types',
'dtype': 'types', 'dtype1': 'types',
'types': [('add', [x.id for x in Type.search([])])], 'types': [('add', [x.id for x in Type.search([])])],
}]) }])
self.assertEqual(len(evaluation2.types), 2) self.assertEqual(len(evaluation2.types), 2)
@ -283,16 +299,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation2.line_values), 2) self.assertEqual(len(evaluation2.line_values), 2)
self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank') self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank')
self.assertEqual( self.assertEqual(
evaluation2.line_values[0].balance, evaluation2.line_values[0].value1, Decimal('0.0'))
Decimal('0.0'))
self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash') self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash')
self.assertEqual( self.assertEqual(
evaluation2.line_values[1].balance, evaluation2.line_values[1].value1, Decimal('35.71'))
Decimal('35.71'))
evaluation3, = Evaluation.create([{ evaluation3, = Evaluation.create([{
'name': 'Evaluation User 1 - Currencies', 'name': 'Evaluation User 1 - Currencies',
'dtype': 'currencies', 'dtype1': 'currencies',
'currencies': [('add', [ 'currencies': [('add', [
x.id for x in Currency.search([])])], x.id for x in Currency.search([])])],
}]) }])
@ -301,16 +315,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation3.line_values), 2) self.assertEqual(len(evaluation3.line_values), 2)
self.assertEqual(evaluation3.line_values[0].name, 'Euro') self.assertEqual(evaluation3.line_values[0].name, 'Euro')
self.assertEqual( self.assertEqual(
evaluation3.line_values[0].balance, evaluation3.line_values[0].value1, Decimal('0.0'))
Decimal('0.0'))
self.assertEqual(evaluation3.line_values[1].name, 'usd') self.assertEqual(evaluation3.line_values[1].name, 'usd')
self.assertEqual( self.assertEqual(
evaluation3.line_values[1].balance, evaluation3.line_values[1].value1, Decimal('35.71'))
Decimal('35.71'))
evaluation4, = Evaluation.create([{ evaluation4, = Evaluation.create([{
'name': 'Evaluation User 1 - Categories', 'name': 'Evaluation User 1 - Categories',
'dtype': 'categories', 'dtype1': 'categories',
'categories': [('add', [ 'categories': [('add', [
x.id for x in books_owner1[0].categories])], x.id for x in books_owner1[0].categories])],
}]) }])
@ -318,11 +330,9 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation4.currency.rec_name, 'Euro') self.assertEqual(evaluation4.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation4.line_values), 1) self.assertEqual(len(evaluation4.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation4.line_values[0].name, evaluation4.line_values[0].name, 'Book 1, User 1')
'Book 1, User 1')
self.assertEqual( self.assertEqual(
evaluation4.line_values[0].balance, evaluation4.line_values[0].value1, Decimal('23.81'))
Decimal('23.81'))
self.assertEqual(Evaluation.search_count([]), 4) self.assertEqual(Evaluation.search_count([]), 4)
@ -345,22 +355,20 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation1, = Evaluation.create([{ evaluation1, = Evaluation.create([{
'name': 'Evaluation User 2 - Cashbooks', 'name': 'Evaluation User 2 - Cashbooks',
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books_owner2])], 'cashbooks': [('add', [x.id for x in books_owner2])],
}]) }])
self.assertEqual(len(evaluation1.cashbooks), 1) self.assertEqual(len(evaluation1.cashbooks), 1)
self.assertEqual(evaluation1.currency.rec_name, 'Euro') self.assertEqual(evaluation1.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation1.line_values), 1) self.assertEqual(len(evaluation1.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation1.line_values[0].name, evaluation1.line_values[0].name, 'Book 3 | 23.00 € | Open')
'Book 3 | 23.00 € | Open')
self.assertEqual( self.assertEqual(
evaluation1.line_values[0].balance, evaluation1.line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
evaluation2, = Evaluation.create([{ evaluation2, = Evaluation.create([{
'name': 'Evaluation User 2 - Types', 'name': 'Evaluation User 2 - Types',
'dtype': 'types', 'dtype1': 'types',
'types': [('add', [x.id for x in Type.search([])])], 'types': [('add', [x.id for x in Type.search([])])],
}]) }])
self.assertEqual(len(evaluation2.types), 2) self.assertEqual(len(evaluation2.types), 2)
@ -368,16 +376,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation2.line_values), 2) self.assertEqual(len(evaluation2.line_values), 2)
self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank') self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank')
self.assertEqual( self.assertEqual(
evaluation2.line_values[0].balance, evaluation2.line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash') self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash')
self.assertEqual( self.assertEqual(
evaluation2.line_values[1].balance, evaluation2.line_values[1].value1, Decimal('0.0'))
Decimal('0.0'))
evaluation3, = Evaluation.create([{ evaluation3, = Evaluation.create([{
'name': 'Evaluation User 2 - Currencies', 'name': 'Evaluation User 2 - Currencies',
'dtype': 'currencies', 'dtype1': 'currencies',
'currencies': [('add', [ 'currencies': [('add', [
x.id for x in Currency.search([])])], x.id for x in Currency.search([])])],
}]) }])
@ -386,16 +392,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation3.line_values), 2) self.assertEqual(len(evaluation3.line_values), 2)
self.assertEqual(evaluation3.line_values[0].name, 'Euro') self.assertEqual(evaluation3.line_values[0].name, 'Euro')
self.assertEqual( self.assertEqual(
evaluation3.line_values[0].balance, evaluation3.line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluation3.line_values[1].name, 'usd') self.assertEqual(evaluation3.line_values[1].name, 'usd')
self.assertEqual( self.assertEqual(
evaluation3.line_values[1].balance, evaluation3.line_values[1].value1, Decimal('0.0'))
Decimal('0.0'))
evaluation4, = Evaluation.create([{ evaluation4, = Evaluation.create([{
'name': 'Evaluation User 2 - Categories', 'name': 'Evaluation User 2 - Categories',
'dtype': 'categories', 'dtype1': 'categories',
'categories': [('add', [ 'categories': [('add', [
x.id for x in books_owner2[0].categories])], x.id for x in books_owner2[0].categories])],
}]) }])
@ -403,11 +407,9 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation4.currency.rec_name, 'Euro') self.assertEqual(evaluation4.currency.rec_name, 'Euro')
self.assertEqual(len(evaluation4.line_values), 1) self.assertEqual(len(evaluation4.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation4.line_values[0].name, evaluation4.line_values[0].name, 'Book 3, User 2')
'Book 3, User 2')
self.assertEqual( self.assertEqual(
evaluation4.line_values[0].balance, evaluation4.line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(Evaluation.search_count([]), 4) self.assertEqual(Evaluation.search_count([]), 4)
@ -421,17 +423,13 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluations[0].currency.rec_name, 'Euro') self.assertEqual(evaluations[0].currency.rec_name, 'Euro')
self.assertEqual(len(evaluations[0].line_values), 2) self.assertEqual(len(evaluations[0].line_values), 2)
self.assertEqual( self.assertEqual(
evaluations[0].line_values[0].name, evaluations[0].line_values[0].name, 'Book 1 | 25.00 usd | Open')
'Book 1 | 25.00 usd | Open')
self.assertEqual( self.assertEqual(
evaluations[0].line_values[0].balance, evaluations[0].line_values[0].value1, Decimal('23.81'))
Decimal('23.81'))
self.assertEqual( self.assertEqual(
evaluations[0].line_values[1].name, evaluations[0].line_values[1].name, 'Book 2 | 12.50 usd | Open')
'Book 2 | 12.50 usd | Open')
self.assertEqual( self.assertEqual(
evaluations[0].line_values[1].balance, evaluations[0].line_values[1].value1, Decimal('11.9'))
Decimal('11.9'))
self.assertEqual(evaluations[1].name, 'Evaluation User 1 - Categories') self.assertEqual(evaluations[1].name, 'Evaluation User 1 - Categories')
self.assertEqual(len(evaluations[1].categories), 1) self.assertEqual(len(evaluations[1].categories), 1)
@ -439,8 +437,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[1].line_values), 1) 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].name, 'Book 1, User 1')
self.assertEqual( self.assertEqual(
evaluations[1].line_values[0].balance, evaluations[1].line_values[0].value1, Decimal('23.81'))
Decimal('23.81'))
self.assertEqual(evaluations[2].name, 'Evaluation User 1 - Currencies') self.assertEqual(evaluations[2].name, 'Evaluation User 1 - Currencies')
self.assertEqual(len(evaluations[2].currencies), 2) self.assertEqual(len(evaluations[2].currencies), 2)
@ -448,12 +445,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[2].line_values), 2) self.assertEqual(len(evaluations[2].line_values), 2)
self.assertEqual(evaluations[2].line_values[0].name, 'Euro') self.assertEqual(evaluations[2].line_values[0].name, 'Euro')
self.assertEqual( self.assertEqual(
evaluations[2].line_values[0].balance, evaluations[2].line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluations[2].line_values[1].name, 'usd') self.assertEqual(evaluations[2].line_values[1].name, 'usd')
self.assertEqual( self.assertEqual(
evaluations[2].line_values[1].balance, evaluations[2].line_values[1].value1, Decimal('35.71'))
Decimal('35.71'))
self.assertEqual(evaluations[3].name, 'Evaluation User 1 - Types') self.assertEqual(evaluations[3].name, 'Evaluation User 1 - Types')
self.assertEqual(len(evaluations[3].types), 2) self.assertEqual(len(evaluations[3].types), 2)
@ -461,23 +456,19 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[3].line_values), 2) 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].name, 'BK - Bank')
self.assertEqual( self.assertEqual(
evaluations[3].line_values[0].balance, evaluations[3].line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluations[3].line_values[1].name, 'CAS - Cash') self.assertEqual(evaluations[3].line_values[1].name, 'CAS - Cash')
self.assertEqual( self.assertEqual(
evaluations[3].line_values[1].balance, evaluations[3].line_values[1].value1, Decimal('35.71'))
Decimal('35.71'))
self.assertEqual(evaluations[4].name, 'Evaluation User 2 - Cashbooks') self.assertEqual(evaluations[4].name, 'Evaluation User 2 - Cashbooks')
self.assertEqual(len(evaluations[4].cashbooks), 1) self.assertEqual(len(evaluations[4].cashbooks), 1)
self.assertEqual(evaluations[4].currency.rec_name, 'Euro') self.assertEqual(evaluations[4].currency.rec_name, 'Euro')
self.assertEqual(len(evaluations[4].line_values), 1) self.assertEqual(len(evaluations[4].line_values), 1)
self.assertEqual( self.assertEqual(
evaluations[4].line_values[0].name, evaluations[4].line_values[0].name, 'Book 3 | 23.00 € | Open')
'Book 3 | 23.00 € | Open')
self.assertEqual( self.assertEqual(
evaluations[4].line_values[0].balance, evaluations[4].line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluations[5].name, 'Evaluation User 2 - Categories') self.assertEqual(evaluations[5].name, 'Evaluation User 2 - Categories')
self.assertEqual(len(evaluations[5].categories), 1) self.assertEqual(len(evaluations[5].categories), 1)
@ -485,8 +476,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[5].line_values), 1) 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].name, 'Book 3, User 2')
self.assertEqual( self.assertEqual(
evaluations[5].line_values[0].balance, evaluations[5].line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluations[6].name, 'Evaluation User 2 - Currencies') self.assertEqual(evaluations[6].name, 'Evaluation User 2 - Currencies')
self.assertEqual(len(evaluations[6].currencies), 2) self.assertEqual(len(evaluations[6].currencies), 2)
@ -494,12 +484,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[6].line_values), 2) self.assertEqual(len(evaluations[6].line_values), 2)
self.assertEqual(evaluations[6].line_values[0].name, 'Euro') self.assertEqual(evaluations[6].line_values[0].name, 'Euro')
self.assertEqual( self.assertEqual(
evaluations[6].line_values[0].balance, evaluations[6].line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluations[6].line_values[1].name, 'usd') self.assertEqual(evaluations[6].line_values[1].name, 'usd')
self.assertEqual( self.assertEqual(
evaluations[6].line_values[1].balance, evaluations[6].line_values[1].value1, Decimal('35.71'))
Decimal('35.71'))
self.assertEqual(evaluations[7].name, 'Evaluation User 2 - Types') self.assertEqual(evaluations[7].name, 'Evaluation User 2 - Types')
self.assertEqual(len(evaluations[7].types), 2) self.assertEqual(len(evaluations[7].types), 2)
@ -507,12 +495,99 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluations[7].line_values), 2) 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].name, 'BK - Bank')
self.assertEqual( self.assertEqual(
evaluations[7].line_values[0].balance, evaluations[7].line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluations[7].line_values[1].name, 'CAS - Cash') self.assertEqual(evaluations[7].line_values[1].name, 'CAS - Cash')
self.assertEqual( self.assertEqual(
evaluations[7].line_values[1].balance, evaluations[7].line_values[1].value1, Decimal('35.71'))
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() @with_transaction()
def test_report_update_name_of_line(self): def test_report_update_name_of_line(self):
@ -530,7 +605,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
'company': company.id}): 'company': company.id}):
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])], 'cashbooks': [('add', [x.id for x in books])],
}]) }])
self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.cashbooks), 3)
@ -592,7 +667,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
# valid # valid
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])], 'cashbooks': [('add', [x.id for x in books])],
}]) }])
self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.cashbooks), 3)
@ -607,7 +682,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'cashbooks_gldiff', 'dtype1': 'cashbooks_gldiff',
}]) }])
self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual(len(evaluation.types), 0) self.assertEqual(len(evaluation.types), 0)
@ -617,7 +692,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'cashbooks_glperc', 'dtype1': 'cashbooks_glperc',
}]) }])
self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual(len(evaluation.types), 0) self.assertEqual(len(evaluation.types), 0)
@ -629,7 +704,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'types', 'dtype1': 'types',
'types': [('add', [x.id for x in Types.search([])])], 'types': [('add', [x.id for x in Types.search([])])],
}]) }])
self.assertEqual(len(evaluation.cashbooks), 0) self.assertEqual(len(evaluation.cashbooks), 0)
@ -641,7 +716,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'types', 'dtype1': 'types',
}]) }])
self.assertEqual(len(evaluation.cashbooks), 0) self.assertEqual(len(evaluation.cashbooks), 0)
self.assertEqual(len(evaluation.types), 2) self.assertEqual(len(evaluation.types), 2)
@ -651,7 +726,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'currencies', 'dtype1': 'currencies',
'currencies': [('add', [ 'currencies': [('add', [
x.id for x in Currency.search([])])], x.id for x in Currency.search([])])],
}]) }])
@ -663,7 +738,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'categories', 'dtype1': 'categories',
'categories': [('add', [ 'categories': [('add', [
x.id for x in Category.search([])])], x.id for x in Category.search([])])],
}]) }])
@ -675,7 +750,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.write(*[ Evaluation.write(*[
[evaluation], [evaluation],
{ {
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
}]) }])
self.assertEqual(len(evaluation.cashbooks), 0) self.assertEqual(len(evaluation.cashbooks), 0)
self.assertEqual(len(evaluation.types), 0) self.assertEqual(len(evaluation.types), 0)
@ -698,7 +773,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
# valid # valid
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
'cashbooks': [('add', [x.id for x in books])], 'cashbooks': [('add', [x.id for x in books])],
}]) }])
@ -710,13 +785,13 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.create, Evaluation.create,
[{ [{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'types', # wrong dtype 'dtype1': 'types', # wrong dtype
'cashbooks': [('add', [x.id for x in books])], 'cashbooks': [('add', [x.id for x in books])],
}]) }])
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 2', 'name': 'Evaluation 2',
'dtype': 'types', 'dtype1': 'types',
'types': [('add', [x.id for x in Types.search([])])], 'types': [('add', [x.id for x in Types.search([])])],
}]) }])
@ -728,7 +803,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
Evaluation.create, Evaluation.create,
[{ [{
'name': 'Evaluation 3', 'name': 'Evaluation 3',
'dtype': 'cashbooks', 'dtype1': 'cashbooks',
'types': [('add', [x.id for x in Types.search([])])], 'types': [('add', [x.id for x in Types.search([])])],
}]) }])
@ -739,11 +814,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
""" """
pool = Pool() pool = Pool()
Evaluation = pool.get('cashbook_report.evaluation') Evaluation = pool.get('cashbook_report.evaluation')
try: DashboardAction = pool.get('dashboard.action')
DashboardAction = pool.get('dashboard.action')
except Exception:
print('\n--== Module "dashboard" not installed ==--')
DashboardAction = None
books = self.prep_report_3books() books = self.prep_report_3books()
@ -756,15 +827,14 @@ class ReportTestCase(CashbookInvestmentTestCase):
}]) }])
# add dashboard-action # add dashboard-action
if DashboardAction is not None: dbaction, = DashboardAction.create([{
dbaction, = DashboardAction.create([{ 'user': Transaction().user,
'user': Transaction().user, 'act_window': evaluation.dashb_actwin.id,
'act_window': evaluation.dashb_actwin.id, }])
}]) self.assertEqual(dbaction.user.rec_name, 'Administrator')
self.assertEqual(dbaction.user.rec_name, 'Administrator') self.assertEqual(dbaction.act_window.name, 'Evaluation 1')
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.chart, 'pie')
self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default') self.assertEqual(evaluation.maincolor, 'default')
@ -810,9 +880,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
'name': 'Evaluation 1a', 'name': 'Evaluation 1a',
}]) }])
self.assertTrue(old_win_id != evaluation.dashb_actwin.id) self.assertTrue(old_win_id != evaluation.dashb_actwin.id)
self.assertEqual(DashboardAction.search_count([]), 1)
if DashboardAction is not None:
self.assertEqual(DashboardAction.search_count([]), 1)
@with_transaction() @with_transaction()
def test_report_cashbook_yield(self): def test_report_cashbook_yield(self):
@ -826,7 +894,6 @@ class ReportTestCase(CashbookInvestmentTestCase):
BType = pool.get('cashbook.type') BType = pool.get('cashbook.type')
Asset = pool.get('investment.asset') Asset = pool.get('investment.asset')
CbCategory = pool.get('cashbook.bookcategory') CbCategory = pool.get('cashbook.bookcategory')
MemCache = pool.get('cashbook.memcache')
company = self.prep_company() company = self.prep_company()
with Transaction().set_context({ with Transaction().set_context({
@ -906,7 +973,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
}])], }])],
}]) }])
Line.wfcheck(book_asset.lines) Line.wfcheck(book_asset.lines)
MemCache._cashbook_value_cache.clear_all() self.prep_valstore_run_worker()
self.assertEqual( self.assertEqual(
book_asset.rec_name, book_asset.rec_name,
@ -922,44 +989,41 @@ class ReportTestCase(CashbookInvestmentTestCase):
# evaluation: cashbooks - total yield # evaluation: cashbooks - total yield
evaluation1, = Evaluation.create([{ evaluation1, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'cashbooks_glyield', 'dtype1': 'cashbooks_glyield',
'chart': 'hbar', 'chart': 'hbar',
'cashbooks': [('add', [book_asset.id])], '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(evaluation1.currency.code, 'usd')
self.assertEqual(len(evaluation1.line_values), 1) self.assertEqual(len(evaluation1.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation1.line_values[0].balance, evaluation1.line_values[0].value1, Decimal('5.5'))
Decimal('5.5'))
# evaluation: categories - total yield # evaluation: categories - total yield
evaluation2, = Evaluation.create([{ evaluation2, = Evaluation.create([{
'name': 'Evaluation 2', 'name': 'Evaluation 2',
'dtype': 'category_glyield', 'dtype1': 'categories_glyield',
'chart': 'hbar', 'chart': 'hbar',
'categories': [('add', [book_asset.categories[0].id])], '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(evaluation2.currency.code, 'usd')
self.assertEqual(len(evaluation2.line_values), 1) self.assertEqual(len(evaluation2.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation2.line_values[0].balance, evaluation2.line_values[0].value1, Decimal('5.5'))
Decimal('5.5'))
# evaluation: types - total yield # evaluation: types - total yield
evaluation3, = Evaluation.create([{ evaluation3, = Evaluation.create([{
'name': 'Evaluation 3', 'name': 'Evaluation 3',
'dtype': 'types_glyield', 'dtype1': 'types_glyield',
'chart': 'hbar', 'chart': 'hbar',
'types': [('add', [book_asset.btype.id])], '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(evaluation3.currency.code, 'usd')
self.assertEqual(len(evaluation3.line_values), 1) self.assertEqual(len(evaluation3.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation3.line_values[0].balance, evaluation3.line_values[0].value1, Decimal('5.5'))
Decimal('5.5'))
@with_transaction() @with_transaction()
def test_report_chart_hbar_book_investment(self): def test_report_chart_hbar_book_investment(self):
@ -979,7 +1043,6 @@ class ReportTestCase(CashbookInvestmentTestCase):
Product = pool.get('product.template') Product = pool.get('product.template')
Uom = pool.get('product.uom') Uom = pool.get('product.uom')
CbCategory = pool.get('cashbook.bookcategory') CbCategory = pool.get('cashbook.bookcategory')
MemCache = pool.get('cashbook.memcache')
at, = AccType.create([{ at, = AccType.create([{
'name': 'depot', 'name': 'depot',
@ -1044,7 +1107,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
[books[2].lines[1]], [books[2].lines[1]],
{'quantity': Decimal('2.0'), 'amount': Decimal('3400.0')}, {'quantity': Decimal('2.0'), 'amount': Decimal('3400.0')},
]) ])
MemCache._cashbook_value_cache.clear_all() self.prep_valstore_run_worker()
self.assertEqual( self.assertEqual(
books[0].rec_name, books[0].rec_name,
@ -1070,11 +1133,19 @@ class ReportTestCase(CashbookInvestmentTestCase):
# evaluation: amount-difference # evaluation: amount-difference
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'cashbooks_gldiff', 'dtype1': 'cashbooks_gldiff',
'dtype2': 'cashbooks_glvalue',
'dtype3': 'cashbooks_glyield',
'dtype4': 'cashbooks_glperc',
'dtype5': 'cashbooks',
'chart': 'hbar', 'chart': 'hbar',
'cashbooks': [('add', [x.id for x in books])], '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.chart, 'hbar')
self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default') self.assertEqual(evaluation.maincolor, 'default')
@ -1082,23 +1153,51 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation.currency.code, 'EUR') self.assertEqual(evaluation.currency.code, 'EUR')
self.assertEqual( self.assertEqual(
evaluation.line_values[0].balance, evaluation.line_values[0].value1, Decimal('857.14'))
Decimal('857.14'))
self.assertEqual( self.assertEqual(
evaluation.line_values[1].balance, evaluation.line_values[0].value2, Decimal('6666.67'))
Decimal('476.19'))
self.assertEqual( self.assertEqual(
evaluation.line_values[2].balance, evaluation.line_values[0].value3, Decimal('6666.67'))
Decimal('-33.33')) 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 # evaluation: percent-difference
evaluation2, = Evaluation.create([{ evaluation2, = Evaluation.create([{
'name': 'Evaluation 2', 'name': 'Evaluation 2',
'dtype': 'cashbooks_glperc', 'dtype1': 'cashbooks_glperc',
'chart': 'hbar', 'chart': 'hbar',
'cashbooks': [('add', [x.id for x in books])], '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.chart, 'hbar')
self.assertEqual(evaluation2.legend, True) self.assertEqual(evaluation2.legend, True)
self.assertEqual(evaluation2.maincolor, 'default') self.assertEqual(evaluation2.maincolor, 'default')
@ -1106,23 +1205,20 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation2.currency.code, 'EUR') self.assertEqual(evaluation2.currency.code, 'EUR')
self.assertEqual( self.assertEqual(
evaluation2.line_values[0].balance, evaluation2.line_values[0].value1, Decimal('14.75'))
Decimal('14.75'))
self.assertEqual( self.assertEqual(
evaluation2.line_values[1].balance, evaluation2.line_values[1].value1, Decimal('7.69'))
Decimal('7.69'))
self.assertEqual( self.assertEqual(
evaluation2.line_values[2].balance, evaluation2.line_values[2].value1, Decimal('-0.5'))
Decimal('-0.5'))
# evaluation: percent-difference # evaluation: percent-difference
evaluation3, = Evaluation.create([{ evaluation3, = Evaluation.create([{
'name': 'Evaluation 3', 'name': 'Evaluation 3',
'dtype': 'cashbooks_glvalue', 'dtype1': 'cashbooks_glvalue',
'chart': 'hbar', 'chart': 'hbar',
'cashbooks': [('add', [x.id for x in books])], '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.chart, 'hbar')
self.assertEqual(evaluation3.legend, True) self.assertEqual(evaluation3.legend, True)
self.assertEqual(evaluation3.maincolor, 'default') self.assertEqual(evaluation3.maincolor, 'default')
@ -1130,23 +1226,20 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(evaluation3.currency.code, 'EUR') self.assertEqual(evaluation3.currency.code, 'EUR')
self.assertEqual( self.assertEqual(
evaluation3.line_values[0].balance, evaluation3.line_values[0].value1, Decimal('6666.67'))
Decimal('6666.67'))
self.assertEqual( self.assertEqual(
evaluation3.line_values[1].balance, evaluation3.line_values[1].value1, Decimal('6666.67'))
Decimal('6666.67'))
self.assertEqual( self.assertEqual(
evaluation3.line_values[2].balance, evaluation3.line_values[2].value1, Decimal('6666.67'))
Decimal('6666.67'))
# evaluation: category-current value # evaluation: category-current value
evaluation4, = Evaluation.create([{ evaluation4, = Evaluation.create([{
'name': 'Evaluation 4', 'name': 'Evaluation 4',
'dtype': 'category_glvalue', 'dtype1': 'categories_glvalue',
'chart': 'hbar', 'chart': 'hbar',
'categories': [('add', [cb_cat.id])], '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.chart, 'hbar')
self.assertEqual(evaluation4.legend, True) self.assertEqual(evaluation4.legend, True)
self.assertEqual(evaluation4.maincolor, 'default') self.assertEqual(evaluation4.maincolor, 'default')
@ -1155,17 +1248,16 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation4.line_values), 1) self.assertEqual(len(evaluation4.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation4.line_values[0].balance, evaluation4.line_values[0].value1, Decimal('20000.01'))
Decimal('20000.01'))
# evaluation: category- difference amount # evaluation: category- difference amount
evaluation5, = Evaluation.create([{ evaluation5, = Evaluation.create([{
'name': 'Evaluation 5', 'name': 'Evaluation 5',
'dtype': 'category_gldiff', 'dtype1': 'categories_gldiff',
'chart': 'hbar', 'chart': 'hbar',
'categories': [('add', [cb_cat.id])], '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.chart, 'hbar')
self.assertEqual(evaluation5.legend, True) self.assertEqual(evaluation5.legend, True)
self.assertEqual(evaluation5.maincolor, 'default') self.assertEqual(evaluation5.maincolor, 'default')
@ -1174,17 +1266,16 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation5.line_values), 1) self.assertEqual(len(evaluation5.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation5.line_values[0].balance, evaluation5.line_values[0].value1, Decimal('1300.01'))
Decimal('1300.01'))
# evaluation: category- difference amount # evaluation: category- difference amount
evaluation6, = Evaluation.create([{ evaluation6, = Evaluation.create([{
'name': 'Evaluation 6', 'name': 'Evaluation 6',
'dtype': 'category_glperc', 'dtype1': 'categories_glperc',
'chart': 'hbar', 'chart': 'hbar',
'categories': [('add', [cb_cat.id])], '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.chart, 'hbar')
self.assertEqual(evaluation6.legend, True) self.assertEqual(evaluation6.legend, True)
self.assertEqual(evaluation6.maincolor, 'default') self.assertEqual(evaluation6.maincolor, 'default')
@ -1193,8 +1284,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation6.line_values), 1) self.assertEqual(len(evaluation6.line_values), 1)
self.assertEqual( self.assertEqual(
evaluation6.line_values[0].balance, evaluation6.line_values[0].value1, Decimal('6.95'))
Decimal('6.95'))
@with_transaction() @with_transaction()
def test_report_chart_pie_book_red(self): def test_report_chart_pie_book_red(self):
@ -1212,7 +1302,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'cashbooks': [('add', [x.id for x in books])], '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.chart, 'pie')
self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default') self.assertEqual(evaluation.maincolor, 'default')
@ -1224,8 +1314,7 @@ class ReportTestCase(CashbookInvestmentTestCase):
evaluation.ui_view_chart.model, evaluation.ui_view_chart.model,
'cashbook_report.eval_line') 'cashbook_report.eval_line')
self.assertEqual( self.assertEqual(
evaluation.ui_view_chart.module, evaluation.ui_view_chart.module, 'cashbook_report')
'cashbook_report')
self.assertEqual(evaluation.ui_view_chart.priority, 10) self.assertEqual(evaluation.ui_view_chart.priority, 10)
self.assertEqual(evaluation.ui_view_chart.type, 'graph') self.assertEqual(evaluation.ui_view_chart.type, 'graph')
self.assertEqual( self.assertEqual(
@ -1236,55 +1325,43 @@ class ReportTestCase(CashbookInvestmentTestCase):
<field name="name"/> <field name="name"/>
</x> </x>
<y> <y>
<field name="balance" fill="1" empty="0" string="Cashbooks [Amount]"/> <field name="value1" fill="1" empty="0" string="Cashbooks [Amount]"/>
</y> </y>
</graph> </graph>
""") """)
self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.cashbooks), 3)
self.assertEqual( self.assertEqual(
evaluation.cashbooks[0].rec_name, evaluation.cashbooks[0].rec_name, 'Book 1 | 25.00 usd | Open')
'Book 1 | 25.00 usd | Open')
self.assertEqual( self.assertEqual(
evaluation.cashbooks[1].rec_name, evaluation.cashbooks[1].rec_name, 'Book 2 | 12.50 usd | Open')
'Book 2 | 12.50 usd | Open')
self.assertEqual( self.assertEqual(
evaluation.cashbooks[2].rec_name, evaluation.cashbooks[2].rec_name, 'Book 3 | 23.00 € | Open')
'Book 3 | 23.00 € | Open')
self.assertEqual(evaluation.cashbooks[0].currency.code, 'usd') self.assertEqual(evaluation.cashbooks[0].currency.code, 'usd')
self.assertEqual(evaluation.cashbooks[1].currency.code, 'usd') self.assertEqual(evaluation.cashbooks[1].currency.code, 'usd')
self.assertEqual(evaluation.cashbooks[2].currency.code, 'EUR') self.assertEqual(evaluation.cashbooks[2].currency.code, 'EUR')
self.assertEqual(len(evaluation.line_values), 3) self.assertEqual(len(evaluation.line_values), 3)
self.assertEqual( self.assertEqual(
evaluation.line_values[0].name, evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open')
'Book 1 | 25.00 usd | Open')
self.assertEqual( self.assertEqual(
evaluation.line_values[1].name, evaluation.line_values[1].name, 'Book 2 | 12.50 usd | Open')
'Book 2 | 12.50 usd | Open')
self.assertEqual( self.assertEqual(
evaluation.line_values[2].name, evaluation.line_values[2].name, 'Book 3 | 23.00 € | Open')
'Book 3 | 23.00 € | Open')
self.assertEqual( self.assertEqual(
evaluation.line_values[0].eval_currency.code, evaluation.line_values[0].eval_currency.code, 'EUR')
'EUR')
self.assertEqual( self.assertEqual(
evaluation.line_values[1].eval_currency.code, evaluation.line_values[1].eval_currency.code, 'EUR')
'EUR')
self.assertEqual( self.assertEqual(
evaluation.line_values[2].eval_currency.code, evaluation.line_values[2].eval_currency.code, 'EUR')
'EUR')
self.assertEqual( self.assertEqual(
evaluation.line_values[0].balance, evaluation.line_values[0].value1, Decimal('23.81'))
Decimal('23.81'))
self.assertEqual( self.assertEqual(
evaluation.line_values[1].balance, evaluation.line_values[1].value1, Decimal('11.90'))
Decimal('11.90'))
self.assertEqual( self.assertEqual(
evaluation.line_values[2].balance, evaluation.line_values[2].value1, Decimal('23.00'))
Decimal('23.00'))
@with_transaction() @with_transaction()
def test_report_chart_pie_type_red(self): def test_report_chart_pie_type_red(self):
@ -1303,10 +1380,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
'date': date(2022, 5, 15)}): 'date': date(2022, 5, 15)}):
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'types', 'dtype1': 'types',
'types': [('add', [x.id for x in Types.search([])])], '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.chart, 'pie')
self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default') self.assertEqual(evaluation.maincolor, 'default')
@ -1323,21 +1400,17 @@ class ReportTestCase(CashbookInvestmentTestCase):
# 23.00 EUR # 23.00 EUR
self.assertEqual( self.assertEqual(
evaluation.line_values[0].eval_currency.code, evaluation.line_values[0].eval_currency.code, 'EUR')
'EUR')
self.assertEqual(evaluation.line_values[0].name, 'BK - Bank') self.assertEqual(evaluation.line_values[0].name, 'BK - Bank')
self.assertEqual( self.assertEqual(
evaluation.line_values[0].balance, evaluation.line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
# 37.50 USD --> EUR # 37.50 USD --> EUR
self.assertEqual(evaluation.line_values[1].name, 'CAS - Cash') self.assertEqual(evaluation.line_values[1].name, 'CAS - Cash')
self.assertEqual( self.assertEqual(
evaluation.line_values[1].eval_currency.code, evaluation.line_values[1].eval_currency.code, 'EUR')
'EUR')
self.assertEqual( self.assertEqual(
evaluation.line_values[1].balance, evaluation.line_values[1].value1, Decimal('35.71'))
Decimal('35.71'))
@with_transaction() @with_transaction()
def test_report_chart_pie_currency_red(self): def test_report_chart_pie_currency_red(self):
@ -1355,10 +1428,10 @@ class ReportTestCase(CashbookInvestmentTestCase):
'company': company.id}): 'company': company.id}):
evaluation, = Evaluation.create([{ evaluation, = Evaluation.create([{
'name': 'Evaluation 1', 'name': 'Evaluation 1',
'dtype': 'currencies', 'dtype1': 'currencies',
'currencies': [('add', [x.id for x in Currency.search([])])], '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.chart, 'pie')
self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.legend, True)
self.assertEqual(evaluation.maincolor, 'default') self.assertEqual(evaluation.maincolor, 'default')
@ -1372,12 +1445,15 @@ class ReportTestCase(CashbookInvestmentTestCase):
self.assertEqual(len(evaluation.line_values), 2) self.assertEqual(len(evaluation.line_values), 2)
self.assertEqual(evaluation.line_values[0].name, 'Euro') self.assertEqual(evaluation.line_values[0].name, 'Euro')
self.assertEqual( self.assertEqual(
evaluation.line_values[0].balance, evaluation.line_values[0].value1, Decimal('23.0'))
Decimal('23.0'))
self.assertEqual(evaluation.line_values[1].name, 'usd') self.assertEqual(evaluation.line_values[1].name, 'usd')
self.assertEqual( self.assertEqual(
evaluation.line_values[1].balance, evaluation.line_values[1].value1, Decimal('35.71'))
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 # end ReportTestCase

View file

@ -5,7 +5,19 @@ full copyright notices and license terms. -->
<form> <form>
<label name="name"/> <label name="name"/>
<field name="name"/> <field name="name"/>
<label name="balance"/>
<field name="balance"/>
<field name="name_line"/> <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> </form>

View file

@ -7,6 +7,6 @@ full copyright notices and license terms. -->
<field name="name"/> <field name="name"/>
</x> </x>
<y> <y>
<field name="balance" fill="1" empty="0"/> <field name="value1" fill="1" empty="0"/>
</y> </y>
</graph> </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. --> full copyright notices and license terms. -->
<tree > <tree >
<field name="name"/> <field name="name"/>
<field name="balance"/> <field name="value1"/>
<field name="value2"/>
<field name="value3"/>
<field name="value4"/>
<field name="value5"/>
</tree> </tree>

View file

@ -5,10 +5,23 @@ full copyright notices and license terms. -->
<form col="6"> <form col="6">
<label name="name"/> <label name="name"/>
<field name="name"/> <field name="name"/>
<label name="dtype"/>
<field name="dtype"/>
<label name="currency"/> <label name="currency"/>
<field 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"/> <separator colspan="6" id="sepdisplay" string="Representation"/>
<label name="chart"/> <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. --> full copyright notices and license terms. -->
<tree keyword_open="1" sequence="sequence"> <tree keyword_open="1" sequence="sequence">
<field name="name"/> <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="chart"/>
<field name="legend"/> <field name="legend"/>
<field name="maincolor"/> <field name="maincolor"/>