diff --git a/evaluation.py b/evaluation.py index 122d084..daa32d6 100644 --- a/evaluation.py +++ b/evaluation.py @@ -3,14 +3,17 @@ # The COPYRIGHT file at the top level of this repository contains the # full copyright notices and license terms. +from sql.conditionals import Case from trytond.model import ModelView, ModelSQL, fields, sequence_ordered -from trytond.pyson import Eval +from trytond.pyson import Eval, Bool from trytond.transaction import Transaction from trytond.pool import Pool from trytond.i18n import gettext +from trytond.exceptions import UserError from .colors import sel_color as sel_bgcolor -from .templates import template_view_graph, template_view_line, \ - cashbook_types, category_types, booktype_types +from .templates import ( + template_view_graph, template_view_line, cashbook_types, + category_types, booktype_types, currency_types) sel_chart = [ @@ -39,10 +42,41 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): string='Company', model_name='company.company', required=True, ondelete="RESTRICT") name = fields.Char(string='Name', required=True) - dtype = fields.Selection( - string='Data type', required=True, sort=True, + + # max. 5x data tyypes to show + dtype1 = fields.Selection( + string='Data type 1', required=True, sort=True, selection='get_sel_etype', help='Type of data displayed') - dtype_string = dtype.translated('dtype') + dtype1_string = dtype1.translated('dtype1') + dtype2 = fields.Selection( + string='Data type 2', sort=True, + selection='get_sel_etype2', help='Type of data displayed', + states={ + 'invisible': ~Bool(Eval('dtype1', '')), + }, depends=['dtype1']) + dtype2_string = dtype2.translated('dtype2') + dtype3 = fields.Selection( + string='Data type 3', sort=True, + selection='get_sel_etype2', help='Type of data displayed', + states={ + 'invisible': ~Bool(Eval('dtype2', '')), + }, depends=['dtype2']) + dtype3_string = dtype3.translated('dtype3') + dtype4 = fields.Selection( + string='Data type 4', sort=True, + selection='get_sel_etype2', help='Type of data displayed', + states={ + 'invisible': ~Bool(Eval('dtype3', '')), + }, depends=['dtype3']) + dtype4_string = dtype4.translated('dtype4') + dtype5 = fields.Selection( + string='Data type 5', sort=True, + selection='get_sel_etype2', help='Type of data displayed', + states={ + 'invisible': ~Bool(Eval('dtype4', '')), + }, depends=['dtype4']) + dtype5_string = dtype5.translated('dtype5') + chart = fields.Selection( string='Chart type', required=True, sort=False, selection=sel_chart, help='Type of graphical presentation.') @@ -62,24 +96,24 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): cashbooks = fields.Many2Many( string='Cashbooks', relation_name='cashbook_report.eval_line', origin='evaluation', target='cashbook', - states={'invisible': ~Eval('dtype', '').in_(cashbook_types)}, - depends=['dtype']) + states={'invisible': ~Eval('dtype1', '').in_(cashbook_types)}, + depends=['dtype1']) types = fields.Many2Many( string='Types', relation_name='cashbook_report.eval_line', origin='evaluation', target='dtype', - states={'invisible': ~Eval('dtype', '').in_(booktype_types)}, - depends=['dtype']) + states={'invisible': ~Eval('dtype1', '').in_(booktype_types)}, + depends=['dtype1']) currencies = fields.Many2Many( string='Currencies', relation_name='cashbook_report.eval_line', origin='evaluation', target='currency', filter=[('cashbook_hasbookings', '=', True)], - states={'invisible': Eval('dtype', '') != 'currencies'}, - depends=['dtype']) + states={'invisible': Eval('dtype1', '') != 'currencies'}, + depends=['dtype1']) categories = fields.Many2Many( string='Categories', relation_name='cashbook_report.eval_line', origin='evaluation', target='category', - states={'invisible': ~Eval('dtype', '').in_(category_types)}, - depends=['dtype']) + states={'invisible': ~Eval('dtype1', '').in_(category_types)}, + depends=['dtype1']) line_values = fields.One2Many( string='Line Values', field='evaluation', readonly=True, @@ -94,6 +128,32 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): string='Dashboard View', model_name='ir.action.act_window.view', ondelete='SET NULL') + @classmethod + def __register__(cls, module_name): + super(Evaluation, cls).__register__(module_name) + + table = cls.__table_handler__(module_name) + tav_eval = cls.__table__() + cursor = Transaction().connection.cursor() + + # x.0.9 --> x.0.10 + if table.column_exist('dtype'): + query = tav_eval.update( + columns=[tav_eval.dtype1], + values=[Case( + (tav_eval.dtype == 'category_gldiff', + 'categories_gldiff'), + (tav_eval.dtype == 'category_glvalue', + 'categories_glvalue'), + (tav_eval.dtype == 'category_glperc', + 'categories_glperc'), + (tav_eval.dtype == 'category_glyield', + 'categories_glyield'), + else_=tav_eval.dtype) + ]) + cursor.execute(*query) + table.drop_column('dtype') + @classmethod def default_currency(cls): """ currency of company @@ -129,11 +189,94 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): return True @classmethod - def default_dtype(cls): + def default_dtype1(cls): """ default 'book' """ return 'cashbooks' + @classmethod + def default_dtype2(cls): + """ default None + """ + return None + + @classmethod + def default_dtype3(cls): + """ default None + """ + return None + + @classmethod + def default_dtype4(cls): + """ default None + """ + return None + + @classmethod + def default_dtype5(cls): + """ default None + """ + return None + + @fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5') + def on_change_dtype1(self): + """ update other dtype-fields + """ + self.get_onchange_dtypes() + + @fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5') + def on_change_dtype2(self): + """ update other dtype-fields + """ + self.get_onchange_dtypes() + + @fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5') + def on_change_dtype3(self): + """ update other dtype-fields + """ + self.get_onchange_dtypes() + + @fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5') + def on_change_dtype4(self): + """ update other dtype-fields + """ + self.get_onchange_dtypes() + + @fields.depends('dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5') + def on_change_dtype5(self): + """ update other dtype-fields + """ + self.get_onchange_dtypes() + + def get_onchange_dtypes(self): + """ update other dtype-fields + """ + dtypes = [x[0] for x in self.get_sel_etype2()] + + if not self.dtype1: + self.dtype2 = None + + if self.dtype2 and (self.dtype2 not in dtypes): + self.dtype2 = None + + if not self.dtype2: + self.dtype3 = None + + if self.dtype3 and (self.dtype3 not in dtypes): + self.dtype3 = None + + if not self.dtype3: + self.dtype4 = None + + if self.dtype4 and (self.dtype4 not in dtypes): + self.dtype4 = None + + if not self.dtype4: + self.dtype5 = None + + if self.dtype5 and (self.dtype5 not in dtypes): + self.dtype5 = None + @classmethod def default_chart(cls): """ default 'pie' @@ -144,18 +287,42 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): def get_sel_etype(cls): """ get list of evaluation-types """ - return [ - ('cashbooks', gettext('cashbook_report.msg_dtype_cashbook')), - ('types', gettext('cashbook_report.msg_dtype_type')), - ('currencies', gettext('cashbook_report.msg_dtype_currency')), - ('categories', gettext('cashbook_report.msg_dtype_category')), - ] + result = [('', '-/-')] + result.extend([ + (x, gettext('cashbook_report.msg_dtype_%s' % x)) + for x in ['cashbooks', 'types', 'currencies', 'categories']]) + return result + + @fields.depends('dtype1') + def get_sel_etype2(self): + """ get list of allowed evaluation-types for dtype2 + """ + Eval2 = Pool().get('cashbook_report.evaluation') + + result = [('', '-/-')] + + dtype1 = getattr(self, 'dtype1', None) + if not dtype1: + return result + + dtype = dtype1.split('_')[0] + result.extend([ + x + for x in Eval2.get_sel_etype() + if x[0].startswith(dtype)]) + return result @classmethod def get_create_view_data(cls, evaluation): """ generate dictionary to create view-xml """ - return { + dtypes = [{ + 'name': getattr(evaluation, 'dtype%d_string' % x), + 'fname': 'value%d' % x} + for x in range(1, 6) + if getattr(evaluation, 'dtype%d' % x, None) is not None] + + result = { 'model': 'cashbook_report.eval_line', 'module': 'cashbook_report', 'priority': 10, @@ -167,9 +334,13 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): 'type': evaluation.chart, 'colscheme': '' if evaluation.maincolor == 'default' else 'color="%s"' % evaluation.maincolor, - 'lines': template_view_line % { - 'fill': '1', - 'string': evaluation.dtype_string}}} + 'lines': '\n'.join([ + template_view_line % { + 'fill': '1', + 'fname': x['fname'], + 'string': x['name']} + for x in dtypes])}} + return result @classmethod def uiview_delete(cls, evaluations): @@ -221,7 +392,8 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): 'name': evaluation.name, 'res_model': 'cashbook_report.eval_line', 'usage': 'dashboard', - 'context_domain': '[["evaluation", "=", %d]]' % evaluation.id, + 'context_domain': '[["evaluation", "=", %d]]' % ( + evaluation.id), }]) dashb_actview, = ActView.create([{ @@ -253,12 +425,51 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): if len(to_write_dbaction) > 0: DashboardAction.write(*to_write_dbaction) - cls.uiview_delete(evaluations) - if len(to_write_eval) > 0: Evaluation2.write(*to_write_eval) + @classmethod + def validate(cls, records): + """ check dtype_x + """ + dtypes = [] + dtypes.extend(cashbook_types) + dtypes.extend(category_types) + dtypes.extend(booktype_types) + dtypes.extend(currency_types) + + for record in records: + if record.dtype1 not in dtypes: + raise UserError(gettext( + 'cashbook_report.msg_invalid_dtype', + typename='one of: %(names)s' % { + 'names': ', '.join(dtypes)})) + + # dtype2...5 must be of same range + dt1 = record.dtype1.split('_')[0] + for x in range(2, 6): + dt_val = getattr(record, 'dtype%d' % x, None) + if dt_val: + + if record.chart == 'pie': + raise UserError(gettext( + 'cashbook_report.msg_no_pie_with_dtype2', + evalname=record.rec_name)) + + if dt_val not in dtypes: + raise UserError(gettext( + 'cashbook_report.msg_invalid_dtype', + typename='one of: %(names)s' % { + 'names': ', '.join(dtypes)})) + + if not dt_val.startswith(dt1): + raise UserError(gettext( + 'cashbook_report.msg_not_same_basetype', + typename=gettext( + 'cashbook_report.msg_dtype_%s' % record.dtype1) + )) + @classmethod def create(cls, vlist): """ add chart @@ -269,37 +480,48 @@ class Evaluation(sequence_ordered(), ModelSQL, ModelView): @classmethod def write(cls, *args): - """ unlink records if dtype changes + """ unlink records if dtypex changes """ to_write = [] to_update_uiview = [] + dtypes = {'dtype1', 'dtype2', 'dtype3', 'dtype4', 'dtype5'} + actions = iter(args) for evaluations, values in zip(actions, actions): # update ui-view if related fields change - if len(set({ - 'name', 'dtype', 'bgcolor', 'maincolor', - 'legend', 'chart'}).intersection(values.keys())) > 0: + uiview_fields = { + 'name', 'bgcolor', 'maincolor', 'legend', 'chart'} + uiview_fields.update(dtypes) + if uiview_fields.intersection(values.keys()): to_update_uiview.extend(evaluations) - # unlink records if dtype changes - if 'dtype' in values.keys(): + # unlink records if dtype(x) changes + if set(values.keys()).intersection(dtypes): for evaluation in evaluations: - if evaluation.dtype == values['dtype']: + dt_value = {x: values.get(x, None) for x in dtypes} + dt_eval = {x: getattr(evaluation, x, None) for x in dtypes} + + # skip un-link if same values are to write + if dt_value == dt_eval: continue + dtype1 = values.get('dtype1', evaluation.dtype1) for dt in [ 'cashbooks', 'types', 'currencies', 'categories']: - if (not values['dtype'].startswith(dt)) and \ - (len(getattr(evaluation, dt)) > 0): - to_write.extend([ - [evaluation], - { - dt: [('remove', [ - x.id for x in getattr( - evaluation, dt)])], - }]) + if dtype1.startswith(dt): + continue + + lines = getattr(evaluation, dt) + if not lines: + continue + + to_write.extend([ + [evaluation], + { + dt: [('remove', [x.id for x in lines])], + }]) args = list(args) args.extend(to_write) diff --git a/investment.py b/investment.py index 35d9240..2e13a99 100644 --- a/investment.py +++ b/investment.py @@ -18,21 +18,21 @@ class InvestmentEvaluation(metaclass=PoolMeta): result = super(InvestmentEvaluation, cls).get_sel_etype() result.extend([ ('cashbooks_gldiff', gettext( - 'cashbook_report.msg_dtype_cashbook_gldiff')), + 'cashbook_report.msg_dtype_cashbooks_gldiff')), ('cashbooks_glperc', gettext( - 'cashbook_report.msg_dtype_cashbook_glperc')), + 'cashbook_report.msg_dtype_cashbooks_glperc')), ('cashbooks_glvalue', gettext( 'cashbook_report.msg_dtype_cashbooks_glvalue')), ('cashbooks_glyield', gettext( 'cashbook_report.msg_dtype_cashbooks_glyield')), - ('category_gldiff', gettext( - 'cashbook_report.msg_dtype_category_gldiff')), - ('category_glvalue', gettext( - 'cashbook_report.msg_dtype_category_glvalue')), - ('category_glperc', gettext( - 'cashbook_report.msg_dtype_category_glperc')), - ('category_glyield', gettext( - 'cashbook_report.msg_dtype_category_glyield')), + ('categories_gldiff', gettext( + 'cashbook_report.msg_dtype_categories_gldiff')), + ('categories_glvalue', gettext( + 'cashbook_report.msg_dtype_categories_glvalue')), + ('categories_glperc', gettext( + 'cashbook_report.msg_dtype_categories_glperc')), + ('categories_glyield', gettext( + 'cashbook_report.msg_dtype_categories_glyield')), ('types_gldiff', gettext( 'cashbook_report.msg_dtype_types_gldiff')), ('types_glvalue', gettext( @@ -142,7 +142,7 @@ class InvestmentLine(metaclass=PoolMeta): books[0].currency, book.yield_balance) return result - def get_value_category_glperc(self): + def get_value_categories_glperc(self): """ get percent of profit/loss by category """ if self.category is None: @@ -151,7 +151,7 @@ class InvestmentLine(metaclass=PoolMeta): return self.get_percent_by_query([ ('categories.id', '=', self.category.id)]) - def get_value_category_gldiff(self): + def get_value_categories_gldiff(self): """ get difference amount by category """ if self.category is None: @@ -160,7 +160,7 @@ class InvestmentLine(metaclass=PoolMeta): return self.get_difference_by_query([ ('categories.id', '=', self.category.id)]) - def get_value_category_glvalue(self): + def get_value_categories_glvalue(self): """ get current value by category """ if self.category is None: @@ -169,7 +169,7 @@ class InvestmentLine(metaclass=PoolMeta): return self.get_currentvalue_by_query([ ('categories.id', '=', self.category.id)]) - def get_value_category_glyield(self): + def get_value_categories_glyield(self): """ get total yield by type """ if self.category is None: diff --git a/line.py b/line.py index e07c4ef..4076df0 100644 --- a/line.py +++ b/line.py @@ -6,7 +6,7 @@ from decimal import Decimal from sql.aggregate import Sum from trytond.model import ModelView, ModelSQL, fields -from trytond.pyson import Eval +from trytond.pyson import Eval, Bool from trytond.transaction import Transaction from trytond.i18n import gettext from trytond.exceptions import UserError @@ -24,28 +24,36 @@ class EvaluationLine(ModelSQL, ModelView): cashbook = fields.Many2One( string='Cashbook', ondelete='CASCADE', model_name='cashbook.book', states={ - 'required': Eval('eval_dtype', '').in_(cashbook_types), - }, depends=['eval_dtype']) + 'required': Eval('eval_dtype1', '').in_(cashbook_types), + }, depends=['eval_dtype1']) dtype = fields.Many2One( string='Type', ondelete='CASCADE', model_name='cashbook.type', states={ - 'required': Eval('eval_dtype', '').in_(booktype_types), - }, depends=['eval_dtype']) + 'required': Eval('eval_dtype1', '').in_(booktype_types), + }, depends=['eval_dtype1']) currency = fields.Many2One( string='Currency', ondelete='CASCADE', model_name='currency.currency', states={ - 'required': Eval('eval_dtype', '') == 'currencies', - }, depends=['eval_dtype']) + 'required': Eval('eval_dtype1', '') == 'currencies', + }, depends=['eval_dtype1']) category = fields.Many2One( string='Category', ondelete='CASCADE', model_name='cashbook.bookcategory', states={ - 'required': Eval('eval_dtype', '').in_(category_types), - }, depends=['eval_dtype']) + 'required': Eval('eval_dtype1', '').in_(category_types), + }, depends=['eval_dtype1']) - # dtype + currency of evaluation - eval_dtype = fields.Function(fields.Char( - string='Data type', readonly=True), 'on_change_with_eval_dtype') + # dtypes + currency of evaluation + eval_dtype1 = fields.Function(fields.Char( + string='Data type 1', readonly=True), 'on_change_with_eval_dtype1') + eval_dtype2 = fields.Function(fields.Char( + string='Data type 2', readonly=True), 'on_change_with_eval_dtype2') + eval_dtype3 = fields.Function(fields.Char( + string='Data type 3', readonly=True), 'on_change_with_eval_dtype3') + eval_dtype4 = fields.Function(fields.Char( + string='Data type 4', readonly=True), 'on_change_with_eval_dtype4') + eval_dtype5 = fields.Function(fields.Char( + string='Data type 5', readonly=True), 'on_change_with_eval_dtype5') eval_currency = fields.Function(fields.Many2One( model_name='currency.currency', string="Currency", readonly=True), 'on_change_with_eval_currency') @@ -56,11 +64,35 @@ class EvaluationLine(ModelSQL, ModelView): name = fields.Function(fields.Char( string='Name'), 'on_change_with_name', setter='set_name_data') name_line = fields.Char(string='Name', states={'invisible': True}) - balance = fields.Function(fields.Numeric( - string='Balance', + value1 = fields.Function(fields.Numeric( + string='Value 1', readonly=True, digits=(16, Eval('currency_digits', 2)), depends=['currency_digits']), - 'on_change_with_balance') + 'on_change_with_value1') + value2 = fields.Function(fields.Numeric( + string='Value 2', + readonly=True, digits=(16, Eval('currency_digits', 2)), + states={'invisible': ~Bool(Eval('eval_dtype2', ''))}, + depends=['currency_digits', 'eval_dtype2']), + 'on_change_with_value2') + value3 = fields.Function(fields.Numeric( + string='Value 3', + readonly=True, digits=(16, Eval('currency_digits', 2)), + states={'invisible': ~Bool(Eval('eval_dtype3', ''))}, + depends=['currency_digits', 'eval_dtype3']), + 'on_change_with_value3') + value4 = fields.Function(fields.Numeric( + string='Value 4', + readonly=True, digits=(16, Eval('currency_digits', 2)), + states={'invisible': ~Bool(Eval('eval_dtype4', ''))}, + depends=['currency_digits', 'eval_dtype4']), + 'on_change_with_value4') + value5 = fields.Function(fields.Numeric( + string='Value 5', + readonly=True, digits=(16, Eval('currency_digits', 2)), + states={'invisible': ~Bool(Eval('eval_dtype5', ''))}, + depends=['currency_digits', 'eval_dtype5']), + 'on_change_with_value5') @classmethod def set_name_data(cls, lines, name, value): @@ -94,12 +126,40 @@ class EvaluationLine(ModelSQL, ModelView): return super(EvaluationLine, cls).fields_view_get( view_id=view_id, view_type=view_type) - @fields.depends('evaluation', '_parent_evaluation.dtype') - def on_change_with_eval_dtype(self, name=None): - """ get dtype from parent + @fields.depends('evaluation', '_parent_evaluation.dtype1') + def on_change_with_eval_dtype1(self, name=None): + """ get dtype1 from parent """ if self.evaluation: - return self.evaluation.dtype + return self.evaluation.dtype1 + + @fields.depends('evaluation', '_parent_evaluation.dtype2') + def on_change_with_eval_dtype2(self, name=None): + """ get dtype2 from parent + """ + if self.evaluation: + return self.evaluation.dtype2 + + @fields.depends('evaluation', '_parent_evaluation.dtype3') + def on_change_with_eval_dtype3(self, name=None): + """ get dtype3 from parent + """ + if self.evaluation: + return self.evaluation.dtype3 + + @fields.depends('evaluation', '_parent_evaluation.dtype4') + def on_change_with_eval_dtype4(self, name=None): + """ get dtype4 from parent + """ + if self.evaluation: + return self.evaluation.dtype4 + + @fields.depends('evaluation', '_parent_evaluation.dtype5') + def on_change_with_eval_dtype5(self, name=None): + """ get dtype5 from parent + """ + if self.evaluation: + return self.evaluation.dtype5 @fields.depends('evaluation', '_parent_evaluation.currency') def on_change_with_eval_currency(self, name=None): @@ -118,7 +178,7 @@ class EvaluationLine(ModelSQL, ModelView): return 2 @fields.depends( - 'eval_dtype', 'category', 'cashbook', 'dtype', 'currency', + 'eval_dtype1', 'category', 'cashbook', 'dtype', 'currency', 'name_line') def on_change_with_name(self, name=None): """ get name of Type @@ -129,14 +189,14 @@ class EvaluationLine(ModelSQL, ModelView): return self.name_line # otherwise use rec_name of linked record - if self.eval_dtype: + if self.eval_dtype1: dtype_sel = {'currencies': 'currency'} dtype_sel.update({x: 'cashbook' for x in cashbook_types}) dtype_sel.update({x: 'category' for x in category_types}) dtype_sel.update({x: 'dtype' for x in booktype_types}) return getattr( - getattr(self, dtype_sel[self.eval_dtype], None), + getattr(self, dtype_sel[self.eval_dtype1], None), 'rec_name', None) def convert_to_evalcurrency(self, from_currency, amount): @@ -156,28 +216,28 @@ class EvaluationLine(ModelSQL, ModelView): """ super(EvaluationLine, cls).validate(records) for record in records: - if (record.evaluation.dtype not in cashbook_types) and \ + if (record.evaluation.dtype1 not in cashbook_types) and \ (record.cashbook is not None): raise UserError(gettext( 'cashbook_report.msg_invalid_dtype', - typename=gettext('cashbook_report.msg_dtype_cashbook'))) - if (record.evaluation.dtype not in booktype_types) and \ + typename=gettext('cashbook_report.msg_dtype_cashbooks'))) + if (record.evaluation.dtype1 not in booktype_types) and \ (record.dtype is not None): raise UserError(gettext( 'cashbook_report.msg_invalid_dtype', - typename=gettext('cashbook_report.msg_dtype_type'))) - if (record.evaluation.dtype != 'currencies') and \ + typename=gettext('cashbook_report.msg_dtype_types'))) + if (record.evaluation.dtype1 != 'currencies') and \ (record.currency is not None): raise UserError(gettext( 'cashbook_report.msg_invalid_dtype', - typename=gettext('cashbook_report.msg_dtype_currency'))) - if (record.evaluation.dtype not in category_types) and \ + typename=gettext('cashbook_report.msg_dtype_currencies'))) + if (record.evaluation.dtype1 not in category_types) and \ (record.category is not None): raise UserError(gettext( 'cashbook_report.msg_invalid_dtype', - typename=gettext('cashbook_report.msg_dtype_category'))) + typename=gettext('cashbook_report.msg_dtype_categories'))) - def get_balance_by_query(self, query): + def get_value_by_query(self, query): """ run 'query' on Lines, convert used currencies to evaluation-currency """ @@ -205,10 +265,10 @@ class EvaluationLine(ModelSQL, ModelView): Sum(tab_line.credit - tab_line.debit).as_('balance'), group_by=[tab_book.currency]) cursor.execute(*query) - balances = cursor.fetchall() + records = cursor.fetchall() - for balance in balances: - (id_currency, bal1) = balance + for record in records: + (id_currency, bal1) = record if bal1 is not None: total_amount += self.convert_to_evalcurrency( @@ -231,7 +291,7 @@ class EvaluationLine(ModelSQL, ModelView): if self.category is None: return None - return self.get_balance_by_query([ + return self.get_value_by_query([ ('cashbook.categories.id', '=', self.category.id), ('cashbook.state', '=', 'open'), ('date', '<=', IrDate.today())]) @@ -245,7 +305,7 @@ class EvaluationLine(ModelSQL, ModelView): if self.dtype is None: return None - return self.get_balance_by_query([ + return self.get_value_by_query([ ('cashbook.btype.id', '=', self.dtype.id), ('cashbook.state', '=', 'open'), ('date', '<=', IrDate.today())]) @@ -259,22 +319,74 @@ class EvaluationLine(ModelSQL, ModelView): if self.currency is None: return None - return self.get_balance_by_query([ + return self.get_value_by_query([ ('cashbook.currency.id', '=', self.currency.id), ('cashbook.state', '=', 'open'), ('date', '<=', IrDate.today())]) @fields.depends( - 'eval_dtype', 'eval_currency', 'currency_digits', + 'eval_dtype1', 'eval_currency', 'currency_digits', 'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance', 'category', '_parent_category.id', 'evaluation', '_parent_evaluation.id', 'dtype', 'currency') - def on_change_with_balance(self, name=None): + def on_change_with_value1(self, name=None): + """ balance of value1 + """ + if (self.evaluation is None) or (self.eval_currency is None) or \ + (self.currency_digits is None) or (self.eval_dtype1 is None): + return None + return getattr(self, 'get_value_%s' % self.eval_dtype1)() + + @fields.depends( + 'eval_dtype2', 'eval_currency', 'currency_digits', + 'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance', + 'category', '_parent_category.id', + 'evaluation', '_parent_evaluation.id', 'dtype', 'currency') + def on_change_with_value2(self, name=None): + """ balance of value2 + """ + if (self.evaluation is None) or (self.eval_currency is None) or \ + (self.currency_digits is None) or (self.eval_dtype2 is None): + return None + return getattr(self, 'get_value_%s' % self.eval_dtype2)() + + @fields.depends( + 'eval_dtype3', 'eval_currency', 'currency_digits', + 'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance', + 'category', '_parent_category.id', + 'evaluation', '_parent_evaluation.id', 'dtype', 'currency') + def on_change_with_value3(self, name=None): + """ balance of value3 + """ + if (self.evaluation is None) or (self.eval_currency is None) or \ + (self.currency_digits is None) or (self.eval_dtype3 is None): + return None + return getattr(self, 'get_value_%s' % self.eval_dtype3)() + + @fields.depends( + 'eval_dtype4', 'eval_currency', 'currency_digits', + 'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance', + 'category', '_parent_category.id', + 'evaluation', '_parent_evaluation.id', 'dtype', 'currency') + def on_change_with_value4(self, name=None): + """ balance of value4 + """ + if (self.evaluation is None) or (self.eval_currency is None) or \ + (self.currency_digits is None) or (self.eval_dtype4 is None): + return None + return getattr(self, 'get_value_%s' % self.eval_dtype4)() + + @fields.depends( + 'eval_dtype5', 'eval_currency', 'currency_digits', + 'cashbook', '_parent_cashbook.currency', '_parent_cashbook.balance', + 'category', '_parent_category.id', + 'evaluation', '_parent_evaluation.id', 'dtype', 'currency') + def on_change_with_value5(self, name=None): """ balance of cashbook """ if (self.evaluation is None) or (self.eval_currency is None) or \ - (self.currency_digits is None) or (self.eval_dtype is None): + (self.currency_digits is None) or (self.eval_dtype5 is None): return None - return getattr(self, 'get_value_%s' % self.eval_dtype)() + return getattr(self, 'get_value_%s' % self.eval_dtype5)() # end EvaluationLine diff --git a/locale/de.po b/locale/de.po index 3c9b6b8..a55764a 100644 --- a/locale/de.po +++ b/locale/de.po @@ -10,15 +10,15 @@ msgctxt "model:ir.message,text:msg_name_cashbook" msgid "Type of evaluation must be '%(typename)s'." msgstr "Typ der Auswertung mus '%(typename)s' sein." -msgctxt "model:ir.message,text:msg_dtype_cashbook" +msgctxt "model:ir.message,text:msg_dtype_cashbooks" msgid "Cashbooks [Amount]" msgstr "Kassenbücher [Betrag]" -msgctxt "model:ir.message,text:msg_dtype_cashbook_gldiff" +msgctxt "model:ir.message,text:msg_dtype_cashbooks_gldiff" msgid "Cashbooks [Amount of Profit/Loss]" msgstr "Kassenbücher [Betrag Gewinn/Verlust]" -msgctxt "model:ir.message,text:msg_dtype_cashbook_glperc" +msgctxt "model:ir.message,text:msg_dtype_cashbooks_glperc" msgid "Cashbooks [Percent of Profit/Loss]" msgstr "Kassenbücher [Prozent Gewinn/Verlust]" @@ -30,7 +30,7 @@ msgctxt "model:ir.message,text:msg_dtype_cashbooks_glyield" msgid "Cashbooks [Total Yield]" msgstr "Kassenbücher [Gesamtertrag]" -msgctxt "model:ir.message,text:msg_dtype_type" +msgctxt "model:ir.message,text:msg_dtype_types" msgid "Types of Cashbooks [Amount]" msgstr "Typen von Kassenbüchern [Betrag]" @@ -50,27 +50,27 @@ msgctxt "model:ir.message,text:msg_dtype_types_glyield" msgid "Types of Cashbooks [Total Yield]" msgstr "Typen von Kassenbüchern [Gesamtertrag]" -msgctxt "model:ir.message,text:msg_dtype_currency" +msgctxt "model:ir.message,text:msg_dtype_currencies" msgid "Currencies" msgstr "Währungen" -msgctxt "model:ir.message,text:msg_dtype_category" +msgctxt "model:ir.message,text:msg_dtype_categories" msgid "Categories [Amount]" msgstr "Kategorien [Betrag]" -msgctxt "model:ir.message,text:msg_dtype_category_gldiff" +msgctxt "model:ir.message,text:msg_dtype_categories_gldiff" msgid "Categories [Amount of Profit/Loss]" msgstr "Kategorien [Betrag Gewinn/Verlust]" -msgctxt "model:ir.message,text:msg_dtype_category_glvalue" +msgctxt "model:ir.message,text:msg_dtype_categories_glvalue" msgid "Categories [Current Value]" msgstr "Kategorien [aktueller Wert]" -msgctxt "model:ir.message,text:msg_dtype_category_glperc" +msgctxt "model:ir.message,text:msg_dtype_categories_glperc" msgid "Categories [Percent of Profit/Loss]" msgstr "Kategorien [Prozent Gewinn/Verlust]" -msgctxt "model:ir.message,text:msg_dtype_category_glyield" +msgctxt "model:ir.message,text:msg_dtype_categories_glyield" msgid "Categories [Total Yield]" msgstr "Kategorien [Gesamtertrag]" @@ -78,6 +78,14 @@ msgctxt "model:ir.message,text:msg_name_graph" msgid "Graph: %(gname)s" msgstr "Diagramm: %(gname)s" +msgctxt "model:ir.message,text:msg_not_same_basetype" +msgid "Type of evaluation must be of the same base type like '%(typename)s'." +msgstr "Die Art der Auswertung muss vom gleichen Basistyp wie '%(typename)s' sein." + +msgctxt "model:ir.message,text:msg_no_pie_with_dtype2" +msgid "The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'." +msgstr "Die Tortendarstellung kann nicht mehreren Datenquellen verwendet werden, in der Auswertung '%(evalname)s'." + ################# # ir.rule.group # @@ -134,17 +142,49 @@ msgctxt "field:cashbook_report.eval_line,currency_digits:" msgid "Currency Digits" msgstr "Nachkommastellen Währung" -msgctxt "field:cashbook_report.eval_line,eval_dtype:" -msgid "Data type" -msgstr "Datenart" +msgctxt "field:cashbook_report.eval_line,eval_dtype1:" +msgid "Data type 1" +msgstr "Datenart 1" + +msgctxt "field:cashbook_report.eval_line,eval_dtype2:" +msgid "Data type 2" +msgstr "Datenart 2" + +msgctxt "field:cashbook_report.eval_line,eval_dtype3:" +msgid "Data type 3" +msgstr "Datenart 3" + +msgctxt "field:cashbook_report.eval_line,eval_dtype4:" +msgid "Data type 4" +msgstr "Datenart 4" + +msgctxt "field:cashbook_report.eval_line,eval_dtype5:" +msgid "Data type 5" +msgstr "Datenart 5" msgctxt "field:cashbook_report.eval_line,name:" msgid "Name" msgstr "Name" -msgctxt "field:cashbook_report.eval_line,balance:" -msgid "Balance" -msgstr "Saldo" +msgctxt "field:cashbook_report.eval_line,value1:" +msgid "Value 1" +msgstr "Wert 1" + +msgctxt "field:cashbook_report.eval_line,value2:" +msgid "Value 2" +msgstr "Wert 2" + +msgctxt "field:cashbook_report.eval_line,value3:" +msgid "Value 3" +msgstr "Wert 3" + +msgctxt "field:cashbook_report.eval_line,value4:" +msgid "Value 4" +msgstr "Wert 4" + +msgctxt "field:cashbook_report.eval_line,value5:" +msgid "Value 5" +msgstr "Wert 5" ############################## @@ -166,31 +206,51 @@ msgctxt "view:cashbook_report.evaluation:" msgid "Representation" msgstr "Darstellung" +msgctxt "view:cashbook_report.evaluation:" +msgid "Type of data displayed" +msgstr "Art der dargestellten Daten" + msgctxt "field:cashbook_report.evaluation,name:" msgid "Name" msgstr "Name" -msgctxt "field:cashbook_report.evaluation,dtype:" -msgid "Data type" -msgstr "Datenart" +msgctxt "field:cashbook_report.evaluation,dtype1:" +msgid "Data type 1" +msgstr "Datenart 1" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Cashbooks" -msgstr "Kassenbücher" +msgctxt "help:cashbook_report.evaluation,dtype1:" +msgid "Type of data displayed" +msgstr "Art der dargestellten Daten" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Types of Cashbooks" -msgstr "Typen von Kassenbüchern" +msgctxt "field:cashbook_report.evaluation,dtype2:" +msgid "Data type 2" +msgstr "Datenart 2" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Currencys" -msgstr "Währungen" +msgctxt "help:cashbook_report.evaluation,dtype2:" +msgid "Type of data displayed" +msgstr "Art der dargestellten Daten" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Categories" -msgstr "Kategorien" +msgctxt "field:cashbook_report.evaluation,dtype3:" +msgid "Data type 3" +msgstr "Datenart 3" -msgctxt "help:cashbook_report.evaluation,dtype:" +msgctxt "help:cashbook_report.evaluation,dtype3:" +msgid "Type of data displayed" +msgstr "Art der dargestellten Daten" + +msgctxt "field:cashbook_report.evaluation,dtype4:" +msgid "Data type 4" +msgstr "Datenart 4" + +msgctxt "help:cashbook_report.evaluation,dtype4:" +msgid "Type of data displayed" +msgstr "Art der dargestellten Daten" + +msgctxt "field:cashbook_report.evaluation,dtype5:" +msgid "Data type 5" +msgstr "Datenart 5" + +msgctxt "help:cashbook_report.evaluation,dtype5:" msgid "Type of data displayed" msgstr "Art der dargestellten Daten" diff --git a/locale/en.po b/locale/en.po index 43d6aec..6b00889 100644 --- a/locale/en.po +++ b/locale/en.po @@ -6,15 +6,15 @@ msgctxt "model:ir.message,text:msg_name_cashbook" msgid "Type of evaluation must be '%(typename)s'." msgstr "Type of evaluation must be '%(typename)s'." -msgctxt "model:ir.message,text:msg_dtype_cashbook" +msgctxt "model:ir.message,text:msg_dtype_cashbooks" msgid "Cashbooks [Amount]" msgstr "Cashbooks [Amount]" -msgctxt "model:ir.message,text:msg_dtype_cashbook_gldiff" +msgctxt "model:ir.message,text:msg_dtype_cashbooks_gldiff" msgid "Cashbooks [Amount of Profit/Loss]" msgstr "Cashbooks [Amount of Profit/Loss]" -msgctxt "model:ir.message,text:msg_dtype_cashbook_glperc" +msgctxt "model:ir.message,text:msg_dtype_cashbooks_glperc" msgid "Cashbooks [Percent of Profit/Loss]" msgstr "Cashbooks [Percent of Profit/Loss]" @@ -26,7 +26,7 @@ msgctxt "model:ir.message,text:msg_dtype_cashbooks_glyield" msgid "Cashbooks [Total Yield]" msgstr "Cashbooks [Total Yield]" -msgctxt "model:ir.message,text:msg_dtype_type" +msgctxt "model:ir.message,text:msg_dtype_types" msgid "Types of Cashbooks [Amount]" msgstr "Types of Cashbooks [Amount]" @@ -46,27 +46,27 @@ msgctxt "model:ir.message,text:msg_dtype_types_glyield" msgid "Types of Cashbooks [Total Yield]" msgstr "Types of Cashbooks [Total Yield]" -msgctxt "model:ir.message,text:msg_dtype_currency" +msgctxt "model:ir.message,text:msg_dtype_currencies" msgid "Currencies" msgstr "Currencies" -msgctxt "model:ir.message,text:msg_dtype_category" +msgctxt "model:ir.message,text:msg_dtype_categories" msgid "Categories [Amount]" msgstr "Categories [Amount]" -msgctxt "model:ir.message,text:msg_dtype_category_gldiff" +msgctxt "model:ir.message,text:msg_dtype_categories_gldiff" msgid "Categories [Amount of Profit/Loss]" msgstr "Categories [Amount of Profit/Loss]" -msgctxt "model:ir.message,text:msg_dtype_category_glvalue" +msgctxt "model:ir.message,text:msg_dtype_categories_glvalue" msgid "Categories [Current Value]" msgstr "Categories [Current Value]" -msgctxt "model:ir.message,text:msg_dtype_category_glperc" +msgctxt "model:ir.message,text:msg_dtype_categories_glperc" msgid "Categories [Percent of Profit/Loss]" msgstr "Categories [Percent of Profit/Loss]" -msgctxt "model:ir.message,text:msg_dtype_category_glyield" +msgctxt "model:ir.message,text:msg_dtype_categories_glyield" msgid "Categories [Total Yield]" msgstr "Categories [Total Yield]" @@ -74,6 +74,14 @@ msgctxt "model:ir.message,text:msg_name_graph" msgid "Graph: %(gname)s" msgstr "Graph: %(gname)s" +msgctxt "model:ir.message,text:msg_not_same_basetype" +msgid "Type of evaluation must be of the same base type like '%(typename)s'." +msgstr "Type of evaluation must be of the same base type like '%(typename)s'." + +msgctxt "model:ir.message,text:msg_no_pie_with_dtype2" +msgid "The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'." +msgstr "The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'." + msgctxt "model:ir.rule.group,name:rg_eval_write_adm" msgid "Administrators: Evaluation read/write" msgstr "Administrators: Evaluation read/write" @@ -118,17 +126,49 @@ msgctxt "field:cashbook_report.eval_line,currency_digits:" msgid "Currency Digits" msgstr "Currency Digits" -msgctxt "field:cashbook_report.eval_line,eval_dtype:" -msgid "Data type" -msgstr "Data type" +msgctxt "field:cashbook_report.eval_line,eval_dtype1:" +msgid "Data type 1" +msgstr "Data type 1" + +msgctxt "field:cashbook_report.eval_line,eval_dtype2:" +msgid "Data type 2" +msgstr "Data type 2" + +msgctxt "field:cashbook_report.eval_line,eval_dtype3:" +msgid "Data type 3" +msgstr "Data type 3" + +msgctxt "field:cashbook_report.eval_line,eval_dtype4:" +msgid "Data type 4" +msgstr "Data type 4" + +msgctxt "field:cashbook_report.eval_line,eval_dtype5:" +msgid "Data type 5" +msgstr "Data type 5" msgctxt "field:cashbook_report.eval_line,name:" msgid "Name" msgstr "Name" -msgctxt "field:cashbook_report.eval_line,balance:" -msgid "Balance" -msgstr "Balance" +msgctxt "field:cashbook_report.eval_line,value1:" +msgid "Value 1" +msgstr "Value 1" + +msgctxt "field:cashbook_report.eval_line,value2:" +msgid "Value 2" +msgstr "Value 2" + +msgctxt "field:cashbook_report.eval_line,value3:" +msgid "Value 3" +msgstr "Value 3" + +msgctxt "field:cashbook_report.eval_line,value4:" +msgid "Value 4" +msgstr "Value 4" + +msgctxt "field:cashbook_report.eval_line,value5:" +msgid "Value 5" +msgstr "Value 5" msgctxt "model:cashbook_report.evaluation,name:" msgid "Evaluation" @@ -146,31 +186,51 @@ msgctxt "view:cashbook_report.evaluation:" msgid "Representation" msgstr "Representation" +msgctxt "view:cashbook_report.evaluation:" +msgid "Type of data displayed" +msgstr "Type of data displayed" + msgctxt "field:cashbook_report.evaluation,name:" msgid "Name" msgstr "Name" -msgctxt "field:cashbook_report.evaluation,dtype:" -msgid "Data type" -msgstr "Data type" +msgctxt "field:cashbook_report.evaluation,dtype1:" +msgid "Data type 1" +msgstr "Data type 1" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Cashbooks" -msgstr "Cashbooks" +msgctxt "help:cashbook_report.evaluation,dtype1:" +msgid "Type of data displayed" +msgstr "Type of data displayed" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Types of Cashbooks" -msgstr "Types of Cashbooks" +msgctxt "field:cashbook_report.evaluation,dtype2:" +msgid "Data type 2" +msgstr "Data type 2" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Currencys" -msgstr "Currencys" +msgctxt "help:cashbook_report.evaluation,dtype2:" +msgid "Type of data displayed" +msgstr "Type of data displayed" -msgctxt "selection:cashbook_report.evaluation,dtype:" -msgid "Categories" -msgstr "Categories" +msgctxt "field:cashbook_report.evaluation,dtype3:" +msgid "Data type 3" +msgstr "Data type 3" -msgctxt "help:cashbook_report.evaluation,dtype:" +msgctxt "help:cashbook_report.evaluation,dtype3:" +msgid "Type of data displayed" +msgstr "Type of data displayed" + +msgctxt "field:cashbook_report.evaluation,dtype4:" +msgid "Data type 4" +msgstr "Data type 4" + +msgctxt "help:cashbook_report.evaluation,dtype4:" +msgid "Type of data displayed" +msgstr "Type of data displayed" + +msgctxt "field:cashbook_report.evaluation,dtype5:" +msgid "Data type 5" +msgstr "Data type 5" + +msgctxt "help:cashbook_report.evaluation,dtype5:" msgid "Type of data displayed" msgstr "Type of data displayed" diff --git a/message.xml b/message.xml index e4f1a55..a33373f 100644 --- a/message.xml +++ b/message.xml @@ -8,13 +8,16 @@ full copyright notices and license terms. --> Type of evaluation must be '%(typename)s'. - + + Type of evaluation must be of the same base type like '%(typename)s'. + + Cashbooks [Amount] - + Cashbooks [Amount of Profit/Loss] - + Cashbooks [Percent of Profit/Loss] @@ -23,7 +26,7 @@ full copyright notices and license terms. --> Cashbooks [Total Yield] - + Types of Cashbooks [Amount] @@ -38,27 +41,30 @@ full copyright notices and license terms. --> Types of Cashbooks [Total Yield] - + Currencies - + Categories [Amount] - + Categories [Amount of Profit/Loss] - + Categories [Current Value] - + Categories [Percent of Profit/Loss] - + Categories [Total Yield] Graph: %(gname)s + + The pie display cannot be used by multiple data sources in the evaluation '%(evalname)s'. + diff --git a/templates.py b/templates.py index 58d8764..a44866d 100644 --- a/templates.py +++ b/templates.py @@ -7,13 +7,14 @@ cashbook_types = [ 'cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc', 'cashbooks_glvalue', 'cashbooks_glyield'] category_types = [ - 'categories', 'category_gldiff', 'category_glvalue', - 'category_glperc', 'category_glyield'] + 'categories', 'categories_gldiff', 'categories_glvalue', + 'categories_glperc', 'categories_glyield'] booktype_types = [ 'types', 'types_gldiff', 'types_glvalue', 'types_glperc', 'types_glyield'] +currency_types = ['currencies'] -template_view_line = '' template_view_graph = """ diff --git a/tests/test_report.py b/tests/test_report.py index b9f9c79..acc775c 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -3,14 +3,17 @@ # The COPYRIGHT file at the top level of this repository contains the # full copyright notices and license terms. +from datetime import date +from decimal import Decimal from trytond.tests.test_tryton import with_transaction, activate_module from trytond.pool import Pool from trytond.transaction import Transaction from trytond.exceptions import UserError +from trytond.i18n import gettext from trytond.modules.cashbook_investment.tests.test_module import \ CashbookInvestmentTestCase -from datetime import date -from decimal import Decimal +from trytond.modules.cashbook_report.templates import ( + cashbook_types, category_types, booktype_types, currency_types) class ReportTestCase(CashbookInvestmentTestCase): @@ -136,6 +139,21 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(books[2].balance, Decimal('23.0')) return books + @with_transaction() + def test_report_check_dtype_messages_functions(self): + """ check access to messages and functions for 'dtypes' + """ + Line = Pool().get('cashbook_report.eval_line') + + dtypes = [] + dtypes.extend(currency_types) + dtypes.extend(cashbook_types) + dtypes.extend(category_types) + dtypes.extend(booktype_types) + for x in dtypes: + gettext('cashbook_report.msg_dtype_%s' % x) + getattr(Line, 'get_value_%s' % x) + @with_transaction() def test_report_currency_hasbookings(self): """ check detectpn of bookings @ currency @@ -254,7 +272,7 @@ class ReportTestCase(CashbookInvestmentTestCase): evaluation1, = Evaluation.create([{ 'name': 'Evaluation User 1 - Cashbooks', - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', 'cashbooks': [('add', [x.id for x in books_owner1])], }]) self.assertEqual(len(evaluation1.cashbooks), 2) @@ -264,18 +282,16 @@ class ReportTestCase(CashbookInvestmentTestCase): evaluation1.line_values[0].name, 'Book 1 | 25.00 usd | Open') self.assertEqual( - evaluation1.line_values[0].balance, - Decimal('23.81')) + evaluation1.line_values[0].value1, Decimal('23.81')) self.assertEqual( evaluation1.line_values[1].name, 'Book 2 | 12.50 usd | Open') self.assertEqual( - evaluation1.line_values[1].balance, - Decimal('11.9')) + evaluation1.line_values[1].value1, Decimal('11.9')) evaluation2, = Evaluation.create([{ 'name': 'Evaluation User 1 - Types', - 'dtype': 'types', + 'dtype1': 'types', 'types': [('add', [x.id for x in Type.search([])])], }]) self.assertEqual(len(evaluation2.types), 2) @@ -283,16 +299,14 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation2.line_values), 2) self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank') self.assertEqual( - evaluation2.line_values[0].balance, - Decimal('0.0')) + evaluation2.line_values[0].value1, Decimal('0.0')) self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash') self.assertEqual( - evaluation2.line_values[1].balance, - Decimal('35.71')) + evaluation2.line_values[1].value1, Decimal('35.71')) evaluation3, = Evaluation.create([{ 'name': 'Evaluation User 1 - Currencies', - 'dtype': 'currencies', + 'dtype1': 'currencies', 'currencies': [('add', [ x.id for x in Currency.search([])])], }]) @@ -301,16 +315,14 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation3.line_values), 2) self.assertEqual(evaluation3.line_values[0].name, 'Euro') self.assertEqual( - evaluation3.line_values[0].balance, - Decimal('0.0')) + evaluation3.line_values[0].value1, Decimal('0.0')) self.assertEqual(evaluation3.line_values[1].name, 'usd') self.assertEqual( - evaluation3.line_values[1].balance, - Decimal('35.71')) + evaluation3.line_values[1].value1, Decimal('35.71')) evaluation4, = Evaluation.create([{ 'name': 'Evaluation User 1 - Categories', - 'dtype': 'categories', + 'dtype1': 'categories', 'categories': [('add', [ x.id for x in books_owner1[0].categories])], }]) @@ -318,11 +330,9 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(evaluation4.currency.rec_name, 'Euro') self.assertEqual(len(evaluation4.line_values), 1) self.assertEqual( - evaluation4.line_values[0].name, - 'Book 1, User 1') + evaluation4.line_values[0].name, 'Book 1, User 1') self.assertEqual( - evaluation4.line_values[0].balance, - Decimal('23.81')) + evaluation4.line_values[0].value1, Decimal('23.81')) self.assertEqual(Evaluation.search_count([]), 4) @@ -345,22 +355,20 @@ class ReportTestCase(CashbookInvestmentTestCase): evaluation1, = Evaluation.create([{ 'name': 'Evaluation User 2 - Cashbooks', - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', 'cashbooks': [('add', [x.id for x in books_owner2])], }]) self.assertEqual(len(evaluation1.cashbooks), 1) self.assertEqual(evaluation1.currency.rec_name, 'Euro') self.assertEqual(len(evaluation1.line_values), 1) self.assertEqual( - evaluation1.line_values[0].name, - 'Book 3 | 23.00 € | Open') + evaluation1.line_values[0].name, 'Book 3 | 23.00 € | Open') self.assertEqual( - evaluation1.line_values[0].balance, - Decimal('23.0')) + evaluation1.line_values[0].value1, Decimal('23.0')) evaluation2, = Evaluation.create([{ 'name': 'Evaluation User 2 - Types', - 'dtype': 'types', + 'dtype1': 'types', 'types': [('add', [x.id for x in Type.search([])])], }]) self.assertEqual(len(evaluation2.types), 2) @@ -368,16 +376,14 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation2.line_values), 2) self.assertEqual(evaluation2.line_values[0].name, 'BK - Bank') self.assertEqual( - evaluation2.line_values[0].balance, - Decimal('23.0')) + evaluation2.line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluation2.line_values[1].name, 'CAS - Cash') self.assertEqual( - evaluation2.line_values[1].balance, - Decimal('0.0')) + evaluation2.line_values[1].value1, Decimal('0.0')) evaluation3, = Evaluation.create([{ 'name': 'Evaluation User 2 - Currencies', - 'dtype': 'currencies', + 'dtype1': 'currencies', 'currencies': [('add', [ x.id for x in Currency.search([])])], }]) @@ -386,16 +392,14 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation3.line_values), 2) self.assertEqual(evaluation3.line_values[0].name, 'Euro') self.assertEqual( - evaluation3.line_values[0].balance, - Decimal('23.0')) + evaluation3.line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluation3.line_values[1].name, 'usd') self.assertEqual( - evaluation3.line_values[1].balance, - Decimal('0.0')) + evaluation3.line_values[1].value1, Decimal('0.0')) evaluation4, = Evaluation.create([{ 'name': 'Evaluation User 2 - Categories', - 'dtype': 'categories', + 'dtype1': 'categories', 'categories': [('add', [ x.id for x in books_owner2[0].categories])], }]) @@ -403,11 +407,9 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(evaluation4.currency.rec_name, 'Euro') self.assertEqual(len(evaluation4.line_values), 1) self.assertEqual( - evaluation4.line_values[0].name, - 'Book 3, User 2') + evaluation4.line_values[0].name, 'Book 3, User 2') self.assertEqual( - evaluation4.line_values[0].balance, - Decimal('23.0')) + evaluation4.line_values[0].value1, Decimal('23.0')) self.assertEqual(Evaluation.search_count([]), 4) @@ -421,17 +423,13 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(evaluations[0].currency.rec_name, 'Euro') self.assertEqual(len(evaluations[0].line_values), 2) self.assertEqual( - evaluations[0].line_values[0].name, - 'Book 1 | 25.00 usd | Open') + evaluations[0].line_values[0].name, 'Book 1 | 25.00 usd | Open') self.assertEqual( - evaluations[0].line_values[0].balance, - Decimal('23.81')) + evaluations[0].line_values[0].value1, Decimal('23.81')) self.assertEqual( - evaluations[0].line_values[1].name, - 'Book 2 | 12.50 usd | Open') + evaluations[0].line_values[1].name, 'Book 2 | 12.50 usd | Open') self.assertEqual( - evaluations[0].line_values[1].balance, - Decimal('11.9')) + evaluations[0].line_values[1].value1, Decimal('11.9')) self.assertEqual(evaluations[1].name, 'Evaluation User 1 - Categories') self.assertEqual(len(evaluations[1].categories), 1) @@ -439,8 +437,7 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluations[1].line_values), 1) self.assertEqual(evaluations[1].line_values[0].name, 'Book 1, User 1') self.assertEqual( - evaluations[1].line_values[0].balance, - Decimal('23.81')) + evaluations[1].line_values[0].value1, Decimal('23.81')) self.assertEqual(evaluations[2].name, 'Evaluation User 1 - Currencies') self.assertEqual(len(evaluations[2].currencies), 2) @@ -448,12 +445,10 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluations[2].line_values), 2) self.assertEqual(evaluations[2].line_values[0].name, 'Euro') self.assertEqual( - evaluations[2].line_values[0].balance, - Decimal('23.0')) + evaluations[2].line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluations[2].line_values[1].name, 'usd') self.assertEqual( - evaluations[2].line_values[1].balance, - Decimal('35.71')) + evaluations[2].line_values[1].value1, Decimal('35.71')) self.assertEqual(evaluations[3].name, 'Evaluation User 1 - Types') self.assertEqual(len(evaluations[3].types), 2) @@ -461,23 +456,19 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluations[3].line_values), 2) self.assertEqual(evaluations[3].line_values[0].name, 'BK - Bank') self.assertEqual( - evaluations[3].line_values[0].balance, - Decimal('23.0')) + evaluations[3].line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluations[3].line_values[1].name, 'CAS - Cash') self.assertEqual( - evaluations[3].line_values[1].balance, - Decimal('35.71')) + evaluations[3].line_values[1].value1, Decimal('35.71')) self.assertEqual(evaluations[4].name, 'Evaluation User 2 - Cashbooks') self.assertEqual(len(evaluations[4].cashbooks), 1) self.assertEqual(evaluations[4].currency.rec_name, 'Euro') self.assertEqual(len(evaluations[4].line_values), 1) self.assertEqual( - evaluations[4].line_values[0].name, - 'Book 3 | 23.00 € | Open') + evaluations[4].line_values[0].name, 'Book 3 | 23.00 € | Open') self.assertEqual( - evaluations[4].line_values[0].balance, - Decimal('23.0')) + evaluations[4].line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluations[5].name, 'Evaluation User 2 - Categories') self.assertEqual(len(evaluations[5].categories), 1) @@ -485,8 +476,7 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluations[5].line_values), 1) self.assertEqual(evaluations[5].line_values[0].name, 'Book 3, User 2') self.assertEqual( - evaluations[5].line_values[0].balance, - Decimal('23.0')) + evaluations[5].line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluations[6].name, 'Evaluation User 2 - Currencies') self.assertEqual(len(evaluations[6].currencies), 2) @@ -494,12 +484,10 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluations[6].line_values), 2) self.assertEqual(evaluations[6].line_values[0].name, 'Euro') self.assertEqual( - evaluations[6].line_values[0].balance, - Decimal('23.0')) + evaluations[6].line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluations[6].line_values[1].name, 'usd') self.assertEqual( - evaluations[6].line_values[1].balance, - Decimal('35.71')) + evaluations[6].line_values[1].value1, Decimal('35.71')) self.assertEqual(evaluations[7].name, 'Evaluation User 2 - Types') self.assertEqual(len(evaluations[7].types), 2) @@ -507,12 +495,99 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluations[7].line_values), 2) self.assertEqual(evaluations[7].line_values[0].name, 'BK - Bank') self.assertEqual( - evaluations[7].line_values[0].balance, - Decimal('23.0')) + evaluations[7].line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluations[7].line_values[1].name, 'CAS - Cash') self.assertEqual( - evaluations[7].line_values[1].balance, - Decimal('35.71')) + evaluations[7].line_values[1].value1, Decimal('35.71')) + + @with_transaction() + def test_report_check_allowed_dtypes(self): + """ check allowed dtypes for dtype2...5 in depency of value in dtype + """ + pool = Pool() + Evaluation = pool.get('cashbook_report.evaluation') + + self.prep_report_3books() + + company = self.prep_company() + with Transaction().set_context({ + 'company': company.id}): + evaluation, = Evaluation.create([{ + 'name': 'Evaluation 1', + 'dtype1': 'cashbooks', + }]) + self.assertEqual(len(evaluation.cashbooks), 0) + self.assertEqual([ + x[0] for x in evaluation.get_sel_etype2()], [ + '', 'cashbooks', 'cashbooks_gldiff', 'cashbooks_glperc', + 'cashbooks_glvalue', 'cashbooks_glyield']) + self.assertRaisesRegex( + UserError, + 'The value "types" for field "Data type 2" in ' + + '"Evaluation 1" of "Evaluation" is not one of the ' + + 'allowed options.', + Evaluation.write, + *[ + [evaluation], + { + 'dtype2': 'types', + } + ]) + + self.assertRaisesRegex( + UserError, + "The pie display cannot be used by multiple data sources" + + " in the evaluation 'Evaluation 1'.", + Evaluation.write, + *[[evaluation], {'dtype2': 'cashbooks_glyield'}]) + + Evaluation.write(*[ + [evaluation], + { + 'chart': 'line', + 'dtype2': 'cashbooks_glyield', + 'dtype3': 'cashbooks_glvalue', + }]) + self.assertEqual(evaluation.dtype1, 'cashbooks') + self.assertEqual(evaluation.dtype2, 'cashbooks_glyield') + self.assertEqual(evaluation.dtype3, 'cashbooks_glvalue') + + # run on-cchange + evaluation.dtype1 = 'types' + evaluation.on_change_dtype1() + evaluation.save() + self.assertEqual(evaluation.dtype1, 'types') + self.assertEqual(evaluation.dtype2, None) + self.assertEqual(evaluation.dtype3, None) + + Evaluation.write(*[ + [evaluation], + { + 'dtype1': 'categories_gldiff', + }]) + self.assertEqual([ + x[0] for x in evaluation.get_sel_etype2()], [ + '', 'categories', 'categories_gldiff', 'categories_glvalue', + 'categories_glperc', 'categories_glyield']) + + Evaluation.write(*[ + [evaluation], + { + 'dtype1': 'currencies', + }]) + self.assertEqual([ + x[0] for x in evaluation.get_sel_etype2()], [ + '', 'currencies']) + + Evaluation.write(*[ + [evaluation], + { + 'dtype1': 'types_glperc', + }]) + self.assertEqual([ + x[0] for x in evaluation.get_sel_etype2()], [ + '', 'types', 'types_gldiff', 'types_glvalue', + 'types_glperc', 'types_glyield']) @with_transaction() def test_report_update_name_of_line(self): @@ -530,7 +605,7 @@ class ReportTestCase(CashbookInvestmentTestCase): 'company': company.id}): evaluation, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', 'cashbooks': [('add', [x.id for x in books])], }]) self.assertEqual(len(evaluation.cashbooks), 3) @@ -592,7 +667,7 @@ class ReportTestCase(CashbookInvestmentTestCase): # valid evaluation, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', 'cashbooks': [('add', [x.id for x in books])], }]) self.assertEqual(len(evaluation.cashbooks), 3) @@ -607,7 +682,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'cashbooks_gldiff', + 'dtype1': 'cashbooks_gldiff', }]) self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.types), 0) @@ -617,7 +692,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'cashbooks_glperc', + 'dtype1': 'cashbooks_glperc', }]) self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual(len(evaluation.types), 0) @@ -629,7 +704,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'types', + 'dtype1': 'types', 'types': [('add', [x.id for x in Types.search([])])], }]) self.assertEqual(len(evaluation.cashbooks), 0) @@ -641,7 +716,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'types', + 'dtype1': 'types', }]) self.assertEqual(len(evaluation.cashbooks), 0) self.assertEqual(len(evaluation.types), 2) @@ -651,7 +726,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'currencies', + 'dtype1': 'currencies', 'currencies': [('add', [ x.id for x in Currency.search([])])], }]) @@ -663,7 +738,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'categories', + 'dtype1': 'categories', 'categories': [('add', [ x.id for x in Category.search([])])], }]) @@ -675,7 +750,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.write(*[ [evaluation], { - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', }]) self.assertEqual(len(evaluation.cashbooks), 0) self.assertEqual(len(evaluation.types), 0) @@ -698,7 +773,7 @@ class ReportTestCase(CashbookInvestmentTestCase): # valid evaluation, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', 'cashbooks': [('add', [x.id for x in books])], }]) @@ -710,13 +785,13 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.create, [{ 'name': 'Evaluation 1', - 'dtype': 'types', # wrong dtype + 'dtype1': 'types', # wrong dtype 'cashbooks': [('add', [x.id for x in books])], }]) evaluation, = Evaluation.create([{ 'name': 'Evaluation 2', - 'dtype': 'types', + 'dtype1': 'types', 'types': [('add', [x.id for x in Types.search([])])], }]) @@ -728,7 +803,7 @@ class ReportTestCase(CashbookInvestmentTestCase): Evaluation.create, [{ 'name': 'Evaluation 3', - 'dtype': 'cashbooks', + 'dtype1': 'cashbooks', 'types': [('add', [x.id for x in Types.search([])])], }]) @@ -739,11 +814,7 @@ class ReportTestCase(CashbookInvestmentTestCase): """ pool = Pool() Evaluation = pool.get('cashbook_report.evaluation') - try: - DashboardAction = pool.get('dashboard.action') - except Exception: - print('\n--== Module "dashboard" not installed ==--') - DashboardAction = None + DashboardAction = pool.get('dashboard.action') books = self.prep_report_3books() @@ -756,15 +827,14 @@ class ReportTestCase(CashbookInvestmentTestCase): }]) # add dashboard-action - if DashboardAction is not None: - dbaction, = DashboardAction.create([{ - 'user': Transaction().user, - 'act_window': evaluation.dashb_actwin.id, - }]) - self.assertEqual(dbaction.user.rec_name, 'Administrator') - self.assertEqual(dbaction.act_window.name, 'Evaluation 1') + dbaction, = DashboardAction.create([{ + 'user': Transaction().user, + 'act_window': evaluation.dashb_actwin.id, + }]) + self.assertEqual(dbaction.user.rec_name, 'Administrator') + self.assertEqual(dbaction.act_window.name, 'Evaluation 1') - self.assertEqual(evaluation.dtype, 'cashbooks') + self.assertEqual(evaluation.dtype1, 'cashbooks') self.assertEqual(evaluation.chart, 'pie') self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.maincolor, 'default') @@ -810,9 +880,7 @@ class ReportTestCase(CashbookInvestmentTestCase): 'name': 'Evaluation 1a', }]) self.assertTrue(old_win_id != evaluation.dashb_actwin.id) - - if DashboardAction is not None: - self.assertEqual(DashboardAction.search_count([]), 1) + self.assertEqual(DashboardAction.search_count([]), 1) @with_transaction() def test_report_cashbook_yield(self): @@ -826,7 +894,6 @@ class ReportTestCase(CashbookInvestmentTestCase): BType = pool.get('cashbook.type') Asset = pool.get('investment.asset') CbCategory = pool.get('cashbook.bookcategory') - MemCache = pool.get('cashbook.memcache') company = self.prep_company() with Transaction().set_context({ @@ -906,7 +973,7 @@ class ReportTestCase(CashbookInvestmentTestCase): }])], }]) Line.wfcheck(book_asset.lines) - MemCache._cashbook_value_cache.clear_all() + self.prep_valstore_run_worker() self.assertEqual( book_asset.rec_name, @@ -922,44 +989,41 @@ class ReportTestCase(CashbookInvestmentTestCase): # evaluation: cashbooks - total yield evaluation1, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'cashbooks_glyield', + 'dtype1': 'cashbooks_glyield', 'chart': 'hbar', 'cashbooks': [('add', [book_asset.id])], }]) - self.assertEqual(evaluation1.dtype, 'cashbooks_glyield') + self.assertEqual(evaluation1.dtype1, 'cashbooks_glyield') self.assertEqual(evaluation1.currency.code, 'usd') self.assertEqual(len(evaluation1.line_values), 1) self.assertEqual( - evaluation1.line_values[0].balance, - Decimal('5.5')) + evaluation1.line_values[0].value1, Decimal('5.5')) # evaluation: categories - total yield evaluation2, = Evaluation.create([{ 'name': 'Evaluation 2', - 'dtype': 'category_glyield', + 'dtype1': 'categories_glyield', 'chart': 'hbar', 'categories': [('add', [book_asset.categories[0].id])], }]) - self.assertEqual(evaluation2.dtype, 'category_glyield') + self.assertEqual(evaluation2.dtype1, 'categories_glyield') self.assertEqual(evaluation2.currency.code, 'usd') self.assertEqual(len(evaluation2.line_values), 1) self.assertEqual( - evaluation2.line_values[0].balance, - Decimal('5.5')) + evaluation2.line_values[0].value1, Decimal('5.5')) # evaluation: types - total yield evaluation3, = Evaluation.create([{ 'name': 'Evaluation 3', - 'dtype': 'types_glyield', + 'dtype1': 'types_glyield', 'chart': 'hbar', 'types': [('add', [book_asset.btype.id])], }]) - self.assertEqual(evaluation3.dtype, 'types_glyield') + self.assertEqual(evaluation3.dtype1, 'types_glyield') self.assertEqual(evaluation3.currency.code, 'usd') self.assertEqual(len(evaluation3.line_values), 1) self.assertEqual( - evaluation3.line_values[0].balance, - Decimal('5.5')) + evaluation3.line_values[0].value1, Decimal('5.5')) @with_transaction() def test_report_chart_hbar_book_investment(self): @@ -979,7 +1043,6 @@ class ReportTestCase(CashbookInvestmentTestCase): Product = pool.get('product.template') Uom = pool.get('product.uom') CbCategory = pool.get('cashbook.bookcategory') - MemCache = pool.get('cashbook.memcache') at, = AccType.create([{ 'name': 'depot', @@ -1044,7 +1107,7 @@ class ReportTestCase(CashbookInvestmentTestCase): [books[2].lines[1]], {'quantity': Decimal('2.0'), 'amount': Decimal('3400.0')}, ]) - MemCache._cashbook_value_cache.clear_all() + self.prep_valstore_run_worker() self.assertEqual( books[0].rec_name, @@ -1070,11 +1133,19 @@ class ReportTestCase(CashbookInvestmentTestCase): # evaluation: amount-difference evaluation, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'cashbooks_gldiff', + 'dtype1': 'cashbooks_gldiff', + 'dtype2': 'cashbooks_glvalue', + 'dtype3': 'cashbooks_glyield', + 'dtype4': 'cashbooks_glperc', + 'dtype5': 'cashbooks', 'chart': 'hbar', 'cashbooks': [('add', [x.id for x in books])], }]) - self.assertEqual(evaluation.dtype, 'cashbooks_gldiff') + self.assertEqual(evaluation.dtype1, 'cashbooks_gldiff') + self.assertEqual(evaluation.dtype2, 'cashbooks_glvalue') + self.assertEqual(evaluation.dtype3, 'cashbooks_glyield') + self.assertEqual(evaluation.dtype4, 'cashbooks_glperc') + self.assertEqual(evaluation.dtype5, 'cashbooks') self.assertEqual(evaluation.chart, 'hbar') self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.maincolor, 'default') @@ -1082,23 +1153,51 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(evaluation.currency.code, 'EUR') self.assertEqual( - evaluation.line_values[0].balance, - Decimal('857.14')) + evaluation.line_values[0].value1, Decimal('857.14')) self.assertEqual( - evaluation.line_values[1].balance, - Decimal('476.19')) + evaluation.line_values[0].value2, Decimal('6666.67')) self.assertEqual( - evaluation.line_values[2].balance, - Decimal('-33.33')) + evaluation.line_values[0].value3, Decimal('6666.67')) + self.assertEqual( + evaluation.line_values[0].value4, Decimal('14.75')) + self.assertEqual( + evaluation.line_values[0].value5, Decimal('5809.52')) + + self.assertEqual( + evaluation.line_values[1].value1, Decimal('476.19')) + self.assertEqual( + evaluation.line_values[1].value2, Decimal('6666.67')) + self.assertEqual( + evaluation.line_values[1].value3, Decimal('6666.67')) + self.assertEqual( + evaluation.line_values[1].value4, Decimal('7.69')) + self.assertEqual( + evaluation.line_values[1].value5, Decimal('6190.48')) + + self.assertEqual( + evaluation.line_values[2].value1, Decimal('-33.33')) + self.assertEqual( + evaluation.line_values[2].value2, Decimal('6666.67')) + self.assertEqual( + evaluation.line_values[2].value3, Decimal('6666.67')) + self.assertEqual( + evaluation.line_values[2].value4, Decimal('-0.50')) + self.assertEqual( + evaluation.line_values[2].value5, Decimal('6700.00')) # evaluation: percent-difference evaluation2, = Evaluation.create([{ 'name': 'Evaluation 2', - 'dtype': 'cashbooks_glperc', + 'dtype1': 'cashbooks_glperc', 'chart': 'hbar', 'cashbooks': [('add', [x.id for x in books])], }]) - self.assertEqual(evaluation2.dtype, 'cashbooks_glperc') + self.assertEqual(evaluation2.dtype1, 'cashbooks_glperc') + self.assertEqual(evaluation2.dtype2, None) + self.assertEqual(evaluation2.dtype3, None) + self.assertEqual(evaluation2.dtype4, None) + self.assertEqual(evaluation2.dtype5, None) + self.assertEqual(evaluation2.chart, 'hbar') self.assertEqual(evaluation2.legend, True) self.assertEqual(evaluation2.maincolor, 'default') @@ -1106,23 +1205,20 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(evaluation2.currency.code, 'EUR') self.assertEqual( - evaluation2.line_values[0].balance, - Decimal('14.75')) + evaluation2.line_values[0].value1, Decimal('14.75')) self.assertEqual( - evaluation2.line_values[1].balance, - Decimal('7.69')) + evaluation2.line_values[1].value1, Decimal('7.69')) self.assertEqual( - evaluation2.line_values[2].balance, - Decimal('-0.5')) + evaluation2.line_values[2].value1, Decimal('-0.5')) # evaluation: percent-difference evaluation3, = Evaluation.create([{ 'name': 'Evaluation 3', - 'dtype': 'cashbooks_glvalue', + 'dtype1': 'cashbooks_glvalue', 'chart': 'hbar', 'cashbooks': [('add', [x.id for x in books])], }]) - self.assertEqual(evaluation3.dtype, 'cashbooks_glvalue') + self.assertEqual(evaluation3.dtype1, 'cashbooks_glvalue') self.assertEqual(evaluation3.chart, 'hbar') self.assertEqual(evaluation3.legend, True) self.assertEqual(evaluation3.maincolor, 'default') @@ -1130,23 +1226,20 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(evaluation3.currency.code, 'EUR') self.assertEqual( - evaluation3.line_values[0].balance, - Decimal('6666.67')) + evaluation3.line_values[0].value1, Decimal('6666.67')) self.assertEqual( - evaluation3.line_values[1].balance, - Decimal('6666.67')) + evaluation3.line_values[1].value1, Decimal('6666.67')) self.assertEqual( - evaluation3.line_values[2].balance, - Decimal('6666.67')) + evaluation3.line_values[2].value1, Decimal('6666.67')) # evaluation: category-current value evaluation4, = Evaluation.create([{ 'name': 'Evaluation 4', - 'dtype': 'category_glvalue', + 'dtype1': 'categories_glvalue', 'chart': 'hbar', 'categories': [('add', [cb_cat.id])], }]) - self.assertEqual(evaluation4.dtype, 'category_glvalue') + self.assertEqual(evaluation4.dtype1, 'categories_glvalue') self.assertEqual(evaluation4.chart, 'hbar') self.assertEqual(evaluation4.legend, True) self.assertEqual(evaluation4.maincolor, 'default') @@ -1155,17 +1248,16 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation4.line_values), 1) self.assertEqual( - evaluation4.line_values[0].balance, - Decimal('20000.01')) + evaluation4.line_values[0].value1, Decimal('20000.01')) # evaluation: category- difference amount evaluation5, = Evaluation.create([{ 'name': 'Evaluation 5', - 'dtype': 'category_gldiff', + 'dtype1': 'categories_gldiff', 'chart': 'hbar', 'categories': [('add', [cb_cat.id])], }]) - self.assertEqual(evaluation5.dtype, 'category_gldiff') + self.assertEqual(evaluation5.dtype1, 'categories_gldiff') self.assertEqual(evaluation5.chart, 'hbar') self.assertEqual(evaluation5.legend, True) self.assertEqual(evaluation5.maincolor, 'default') @@ -1174,17 +1266,16 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation5.line_values), 1) self.assertEqual( - evaluation5.line_values[0].balance, - Decimal('1300.01')) + evaluation5.line_values[0].value1, Decimal('1300.01')) # evaluation: category- difference amount evaluation6, = Evaluation.create([{ 'name': 'Evaluation 6', - 'dtype': 'category_glperc', + 'dtype1': 'categories_glperc', 'chart': 'hbar', 'categories': [('add', [cb_cat.id])], }]) - self.assertEqual(evaluation6.dtype, 'category_glperc') + self.assertEqual(evaluation6.dtype1, 'categories_glperc') self.assertEqual(evaluation6.chart, 'hbar') self.assertEqual(evaluation6.legend, True) self.assertEqual(evaluation6.maincolor, 'default') @@ -1193,8 +1284,7 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation6.line_values), 1) self.assertEqual( - evaluation6.line_values[0].balance, - Decimal('6.95')) + evaluation6.line_values[0].value1, Decimal('6.95')) @with_transaction() def test_report_chart_pie_book_red(self): @@ -1212,7 +1302,7 @@ class ReportTestCase(CashbookInvestmentTestCase): 'name': 'Evaluation 1', 'cashbooks': [('add', [x.id for x in books])], }]) - self.assertEqual(evaluation.dtype, 'cashbooks') + self.assertEqual(evaluation.dtype1, 'cashbooks') self.assertEqual(evaluation.chart, 'pie') self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.maincolor, 'default') @@ -1224,8 +1314,7 @@ class ReportTestCase(CashbookInvestmentTestCase): evaluation.ui_view_chart.model, 'cashbook_report.eval_line') self.assertEqual( - evaluation.ui_view_chart.module, - 'cashbook_report') + evaluation.ui_view_chart.module, 'cashbook_report') self.assertEqual(evaluation.ui_view_chart.priority, 10) self.assertEqual(evaluation.ui_view_chart.type, 'graph') self.assertEqual( @@ -1236,55 +1325,43 @@ class ReportTestCase(CashbookInvestmentTestCase): - + """) self.assertEqual(len(evaluation.cashbooks), 3) self.assertEqual( - evaluation.cashbooks[0].rec_name, - 'Book 1 | 25.00 usd | Open') + evaluation.cashbooks[0].rec_name, 'Book 1 | 25.00 usd | Open') self.assertEqual( - evaluation.cashbooks[1].rec_name, - 'Book 2 | 12.50 usd | Open') + evaluation.cashbooks[1].rec_name, 'Book 2 | 12.50 usd | Open') self.assertEqual( - evaluation.cashbooks[2].rec_name, - 'Book 3 | 23.00 € | Open') + evaluation.cashbooks[2].rec_name, 'Book 3 | 23.00 € | Open') self.assertEqual(evaluation.cashbooks[0].currency.code, 'usd') self.assertEqual(evaluation.cashbooks[1].currency.code, 'usd') self.assertEqual(evaluation.cashbooks[2].currency.code, 'EUR') self.assertEqual(len(evaluation.line_values), 3) self.assertEqual( - evaluation.line_values[0].name, - 'Book 1 | 25.00 usd | Open') + evaluation.line_values[0].name, 'Book 1 | 25.00 usd | Open') self.assertEqual( - evaluation.line_values[1].name, - 'Book 2 | 12.50 usd | Open') + evaluation.line_values[1].name, 'Book 2 | 12.50 usd | Open') self.assertEqual( - evaluation.line_values[2].name, - 'Book 3 | 23.00 € | Open') + evaluation.line_values[2].name, 'Book 3 | 23.00 € | Open') self.assertEqual( - evaluation.line_values[0].eval_currency.code, - 'EUR') + evaluation.line_values[0].eval_currency.code, 'EUR') self.assertEqual( - evaluation.line_values[1].eval_currency.code, - 'EUR') + evaluation.line_values[1].eval_currency.code, 'EUR') self.assertEqual( - evaluation.line_values[2].eval_currency.code, - 'EUR') + evaluation.line_values[2].eval_currency.code, 'EUR') self.assertEqual( - evaluation.line_values[0].balance, - Decimal('23.81')) + evaluation.line_values[0].value1, Decimal('23.81')) self.assertEqual( - evaluation.line_values[1].balance, - Decimal('11.90')) + evaluation.line_values[1].value1, Decimal('11.90')) self.assertEqual( - evaluation.line_values[2].balance, - Decimal('23.00')) + evaluation.line_values[2].value1, Decimal('23.00')) @with_transaction() def test_report_chart_pie_type_red(self): @@ -1303,10 +1380,10 @@ class ReportTestCase(CashbookInvestmentTestCase): 'date': date(2022, 5, 15)}): evaluation, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'types', + 'dtype1': 'types', 'types': [('add', [x.id for x in Types.search([])])], }]) - self.assertEqual(evaluation.dtype, 'types') + self.assertEqual(evaluation.dtype1, 'types') self.assertEqual(evaluation.chart, 'pie') self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.maincolor, 'default') @@ -1323,21 +1400,17 @@ class ReportTestCase(CashbookInvestmentTestCase): # 23.00 EUR self.assertEqual( - evaluation.line_values[0].eval_currency.code, - 'EUR') + evaluation.line_values[0].eval_currency.code, 'EUR') self.assertEqual(evaluation.line_values[0].name, 'BK - Bank') self.assertEqual( - evaluation.line_values[0].balance, - Decimal('23.0')) + evaluation.line_values[0].value1, Decimal('23.0')) # 37.50 USD --> EUR self.assertEqual(evaluation.line_values[1].name, 'CAS - Cash') self.assertEqual( - evaluation.line_values[1].eval_currency.code, - 'EUR') + evaluation.line_values[1].eval_currency.code, 'EUR') self.assertEqual( - evaluation.line_values[1].balance, - Decimal('35.71')) + evaluation.line_values[1].value1, Decimal('35.71')) @with_transaction() def test_report_chart_pie_currency_red(self): @@ -1355,10 +1428,10 @@ class ReportTestCase(CashbookInvestmentTestCase): 'company': company.id}): evaluation, = Evaluation.create([{ 'name': 'Evaluation 1', - 'dtype': 'currencies', + 'dtype1': 'currencies', 'currencies': [('add', [x.id for x in Currency.search([])])], }]) - self.assertEqual(evaluation.dtype, 'currencies') + self.assertEqual(evaluation.dtype1, 'currencies') self.assertEqual(evaluation.chart, 'pie') self.assertEqual(evaluation.legend, True) self.assertEqual(evaluation.maincolor, 'default') @@ -1372,12 +1445,15 @@ class ReportTestCase(CashbookInvestmentTestCase): self.assertEqual(len(evaluation.line_values), 2) self.assertEqual(evaluation.line_values[0].name, 'Euro') self.assertEqual( - evaluation.line_values[0].balance, - Decimal('23.0')) + evaluation.line_values[0].value1, Decimal('23.0')) self.assertEqual(evaluation.line_values[1].name, 'usd') self.assertEqual( - evaluation.line_values[1].balance, - Decimal('35.71')) + evaluation.line_values[1].value1, Decimal('35.71')) + + self.assertEqual(evaluation.line_values[0].value2, None) + self.assertEqual(evaluation.line_values[0].value3, None) + self.assertEqual(evaluation.line_values[0].value4, None) + self.assertEqual(evaluation.line_values[0].value5, None) # end ReportTestCase diff --git a/view/evalline_form.xml b/view/evalline_form.xml index 14d9011..391044d 100644 --- a/view/evalline_form.xml +++ b/view/evalline_form.xml @@ -5,7 +5,19 @@ full copyright notices and license terms. -->