Browse Source

add datetime support, normalize query name and balance account name

pull/90/head
Laetitia Gangloff 10 years ago
committed by Stéphane Bidoul
parent
commit
c58739506b
  1. 40
      mis_builder/models/mis_builder.py
  2. 12
      mis_builder/tests/mis.report.kpi.csv

40
mis_builder/models/mis_builder.py

@ -25,8 +25,8 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from dateutil import parser from dateutil import parser
import traceback import traceback
from lxml import etree
import re import re
import calendar
from openerp.osv import orm, fields from openerp.osv import orm, fields
from openerp.tools.safe_eval import safe_eval from openerp.tools.safe_eval import safe_eval
@ -48,6 +48,15 @@ def _get_selection_label(selection, value):
return '' return ''
def utc_midnight(d, add_day=0):
d = datetime.strptime(d, tools.DEFAULT_SERVER_DATE_FORMAT)
if add_day:
d = d + timedelta(days=add_day)
timestamp = calendar.timegm(d.timetuple())
d_utc_midnight = datetime.utcfromtimestamp(timestamp)
return datetime.strftime(d_utc_midnight, tools.DEFAULT_SERVER_DATETIME_FORMAT)
class mis_report_kpi(orm.Model): class mis_report_kpi(orm.Model):
""" A KPI is an element of a MIS report. """ A KPI is an element of a MIS report.
@ -199,6 +208,16 @@ class mis_report_query(orm.Model):
_order = 'name' _order = 'name'
def _check_name(self, cr, uid, ids, context=None):
for record_name in self.read(cr, uid, ids, ['name']):
if not re.match("[_A-Za-z][_a-zA-Z0-9]*$", record_name['name']):
return False
return True
_constraints = [
(_check_name, 'The name must be a valid python identifier', ['name']),
]
class mis_report(orm.Model): class mis_report(orm.Model):
""" A MIS report template (without period information) """ A MIS report template (without period information)
@ -368,15 +387,12 @@ class mis_report_instance_period(orm.Model):
if user['company_id']: if user['company_id']:
company_id = user['company_id'][0] company_id = user['company_id'][0]
account_ids = account_obj.search(cr, uid, [('company_id', '=', company_id)], context=context) account_ids = account_obj.search(cr, uid, [('company_id', '=', company_id)], context=context)
account_datas = account_obj.read(cr, uid, account_ids,
['code', 'balance'],
context=search_ctx)
account_datas = account_obj.read(cr, uid, account_ids, ['code', 'balance'], context=search_ctx)
balances = {} balances = {}
clean = lambda varStr: re.sub('\W|^(?=\d)', '_', varStr)
for account_data in account_datas: for account_data in account_datas:
# TODO: normalize code (strip special chars)
# TODO: company_id in key # TODO: company_id in key
key = 'bal_' + account_data['code']
key = 'bal' + clean(account_data['code'])
assert key not in balances assert key not in balances
balances[key] = account_data['balance'] balances[key] = account_data['balance']
@ -398,12 +414,10 @@ class mis_report_instance_period(orm.Model):
domain.extend([(query.date_field.name, '>=', c.date_from), domain.extend([(query.date_field.name, '>=', c.date_from),
(query.date_field.name, '<=', c.date_to)]) (query.date_field.name, '<=', c.date_to)])
else: else:
# TODO: datetime support (convert date to utc midnight)
# datetime_from = utc_midnight(date_from)
# datetime_to = utc_midnight(date_to + 1)
# domain.extend([(query.date_field.name, '>=', datetime_from),
# (query.date_field.name, '<', datetime_to)])
raise orm.except_orm(_('Error!'), _('Not implemented'))
datetime_from = utc_midnight(c.date_from)
datetime_to = utc_midnight(c.date_to, add_day=1)
domain.extend([(query.date_field.name, '>=', datetime_from),
(query.date_field.name, '<', datetime_to)])
domain.extend([('company_id', '=', company_id)]) domain.extend([('company_id', '=', company_id)])
field_names = [field.name for field in query.field_ids] field_names = [field.name for field in query.field_ids]
obj_ids = obj.search(cr, uid, domain, context=context) obj_ids = obj.search(cr, uid, domain, context=context)

12
mis_builder/tests/mis.report.kpi.csv

@ -1,7 +1,7 @@
"id","compare_method","description","expression","divider","name","dp","sequence","type","suffix" "id","compare_method","description","expression","divider","name","dp","sequence","type","suffix"
"mis_report_kpi_1","Percentage","chiffre d'affaire","-bal_70","","ca","","","Numeric","€"
"mis_report_kpi_2","Percentage","cost","-bal_60 - bal_61","","cost","","","Numeric","€"
"mis_report_kpi_3","Percentage","profit","ca - cost","","profit","","","Numeric","€"
"mis_report_kpi_4","Difference","margin","profit/ca","","margin","","","Percentage","%"
"mis_report_kpi_5","None","couleur","'vert' if profit > 0 else 'rouge'","","couleur","","","String"
"mis_report_kpi_6","Percentage","total invoice","len(inv)","","total_invoice","","","Numeric","€"
"mis_report_kpi_1","Percentage","chiffre d'affaire","-bal_70","","ca","","1","Numeric","€"
"mis_report_kpi_2","Percentage","cost","-bal_60 - bal_61","","cost","","2","Numeric","€"
"mis_report_kpi_3","Percentage","profit","ca - cost","","profit","","3","Numeric","€"
"mis_report_kpi_4","Difference","margin","profit/ca","","margin","","4","Percentage","%"
"mis_report_kpi_5","None","couleur","'vert' if profit > 0 else 'rouge'","","couleur","","5","String",""
"mis_report_kpi_6","Percentage","total invoice","len(inv)","","total_invoice","","6","Numeric","€"
Loading…
Cancel
Save