diff --git a/mis_builder/models/mis_builder.py b/mis_builder/models/mis_builder.py index 6649f743..3f06faf8 100644 --- a/mis_builder/models/mis_builder.py +++ b/mis_builder/models/mis_builder.py @@ -69,14 +69,22 @@ def _python_bal_var(account_code): def _get_bal_vars_in_expr(expr): - return re.findall(expr, r'\bbal_\w+') + return re.findall(r'\bbal_\w+', expr) def _get_vars_in_expr(expr, varnames=None): if not varnames: return [] varnames_re = r'\b' + r'\b|\b'.join(varnames) + r'\b' - return re.findall(expr, varnames_re) + return re.findall(varnames_re, expr) + + +def _get_bal_vars_in_report(report): + res = set() + for kpi in report.kpi_ids: + for bal_var in _get_bal_vars_in_expr(kpi.expression): + res.add(bal_var) + return res class mis_report_kpi(orm.Model): @@ -274,8 +282,8 @@ class mis_report_query(orm.Model): ids, ['field_ids'], 20), }), 'date_field': fields.many2one('ir.model.fields', required=True, string='Date field', - domain=[('ttype', 'in', ('date', - 'datetime'))]), + domain=[('ttype', 'in', + ('date', 'datetime'))]), 'domain': fields.char(string='Domain'), 'report_id': fields.many2one('mis.report', string='Report'), } @@ -385,22 +393,16 @@ class mis_report_instance_period(orm.Model): all_period_ids = period_obj.search( cr, uid, [('special', '=', False), - '|', ( - 'company_id', '=', - False), - ('company_id', '=', - c.company_id.id)], + '|', ('company_id', '=', False), + ('company_id', '=', c.company_id.id)], order='date_start', context=context) current_period_ids = period_obj.search( cr, uid, [('special', '=', False), ('date_start', '<=', d), - ('date_stop', - '>=', d), - '|', - ('company_id', - '=', False), + ('date_stop', '>=', d), + '|', ('company_id', '=', False), ('company_id', '=', c.company_id.id)], context=context) if not current_period_ids: @@ -497,7 +499,7 @@ class mis_report_instance_period(orm.Model): 'Period name should be unique by report'), ] - def _fetch_balances(self, cr, uid, c, context=None): + def _fetch_balances(self, cr, uid, c, bal_vars, context=None): """ fetch the general account balances for the given period returns a dictionary {bal_: account.balance} @@ -520,7 +522,13 @@ class mis_report_instance_period(orm.Model): cr, uid, ['|', ('company_id', '=', False), ('company_id', '=', c.company_id.id)], - context=context) + context=search_ctx) + # first fetch all codes and filter the one we need + account_datas = account_obj.read( + cr, uid, account_ids, ['code', ], context=search_ctx) + account_ids = [a['id'] for a in account_datas + if _python_bal_var(a['code']) in bal_vars] + # fetch balances account_datas = account_obj.read( cr, uid, account_ids, ['code', 'balance'], context=search_ctx) balances = {} @@ -559,14 +567,7 @@ class mis_report_instance_period(orm.Model): return res - def _get_bal_vars_in_report(self, report): - res = set() - for kpi in report.kpi_ids: - for bal_var in _get_bal_vars_in_expr(kpi.expression): - res.add(bal_var) - return res - - def _compute(self, cr, uid, c, context=None): + def _compute(self, cr, uid, c, bal_vars, context=None): if context is None: context = {} @@ -582,7 +583,7 @@ class mis_report_instance_period(orm.Model): 'len': len, 'avg': lambda l: sum(l) / float(len(l)), } - localdict.update(self._fetch_balances(cr, uid, c, context=context)) + localdict.update(self._fetch_balances(cr, uid, c, bal_vars, context=context)) localdict.update(self._fetch_queries(cr, uid, c, context=context)) for kpi in c.report_instance_id.report_id.kpi_ids: @@ -727,6 +728,8 @@ class mis_report_instance(orm.Model): period_values = {} + bal_vars = _get_bal_vars_in_report(r.report_id) + for period in r.period_ids: # add the column header header['']['cols'].append(dict( @@ -743,7 +746,7 @@ class mis_report_instance(orm.Model): period.date_from)) # compute kpi values values = report_instance_period_obj._compute( - cr, uid, period, context=context) + cr, uid, period, bal_vars, context=context) period_values[period.name] = values for key in values: content[key]['cols'].append(values[key])