Use work type for reporting "Hours per Work type"
This commit is contained in:
@@ -116,95 +116,6 @@ class EnterLines(Wizard):
|
||||
EnterLines()
|
||||
|
||||
|
||||
class HoursWorkType(OSV):
|
||||
'Hours per Work Type'
|
||||
_name = 'timesheet.hours_work_type'
|
||||
|
||||
work_type = fields.Many2One('timesheet.work_type', 'Work Type', select=1)
|
||||
hours = fields.Function('get_hours', digits=(16, 2), string='Hours')
|
||||
|
||||
def table_query(self, context=None):
|
||||
return ('SELECT DISTINCT(work_type) AS id, work_type ' \
|
||||
'FROM timesheet_line', [])
|
||||
|
||||
def get_hours(self, cursor, user, ids, name, arg, context=None):
|
||||
res = {}
|
||||
clause = ' '
|
||||
args = []
|
||||
for work_type_id in ids:
|
||||
res[work_type_id] = 0.0
|
||||
|
||||
if context.get('start_date'):
|
||||
clause += 'AND date >= %s '
|
||||
args.append(context['start_date'])
|
||||
if context.get('end_date'):
|
||||
clause += 'AND date <= %s '
|
||||
args.append(context['end_date'])
|
||||
|
||||
cursor.execute('SELECT work_type, SUM(COALESCE(hours, 0)) ' \
|
||||
'FROM timesheet_line '
|
||||
'WHERE work_type IN (' + \
|
||||
','.join(['%s' for x in ids]) + ') ' \
|
||||
+ clause +
|
||||
'GROUP BY work_type', ids + args)
|
||||
for work_type_id, sum in cursor.fetchall():
|
||||
res[work_type_id] = sum
|
||||
return res
|
||||
|
||||
HoursWorkType()
|
||||
|
||||
|
||||
class OpenHoursWorkTypeInit(WizardOSV):
|
||||
_name = 'timesheet.open_hours_work_type.init'
|
||||
start_date = fields.Date('Start Date')
|
||||
end_date = fields.Date('End Date')
|
||||
|
||||
OpenHoursWorkTypeInit()
|
||||
|
||||
|
||||
class OpenHoursWorkTypes(Wizard):
|
||||
'Open Hours per Work Type'
|
||||
_name = 'timesheet.open_hours_work_type'
|
||||
states = {
|
||||
'init': {
|
||||
'result': {
|
||||
'type': 'form',
|
||||
'object': 'timesheet.open_hours_work_type.init',
|
||||
'state': [
|
||||
('end', 'Cancel', 'gtk-cancel'),
|
||||
('open', 'Open', 'gtk-ok', True),
|
||||
],
|
||||
},
|
||||
},
|
||||
'open': {
|
||||
'result': {
|
||||
'type': 'action',
|
||||
'action': '_action_open',
|
||||
'state': 'end',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
def _action_open(self, cursor, user, data, context=None):
|
||||
model_data_obj = self.pool.get('ir.model.data')
|
||||
act_window_obj = self.pool.get('ir.action.act_window')
|
||||
|
||||
model_data_ids = model_data_obj.search(cursor, user, [
|
||||
('fs_id', '=', 'act_hours_work_type_form'),
|
||||
('module', '=', 'timesheet'),
|
||||
], limit=1, context=context)
|
||||
model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
|
||||
context=context)
|
||||
res = act_window_obj.read(cursor, user, model_data.db_id, context=context)
|
||||
res['context'] = str({
|
||||
'start_date': data['form']['start_date'],
|
||||
'end_date': data['form']['end_date'],
|
||||
})
|
||||
return res
|
||||
|
||||
OpenHoursWorkTypes()
|
||||
|
||||
|
||||
class HoursEmployee(OSV):
|
||||
'Hours per Employee'
|
||||
_name = 'timesheet.hours_employee'
|
||||
|
||||
@@ -63,73 +63,6 @@
|
||||
<menuitem parent="menu_timesheet" action="act_enter_lines"
|
||||
id="menu_enter_lines" sequence="20"/>
|
||||
|
||||
<record model="ir.ui.view" id="hours_work_type_view_tree">
|
||||
<field name="model">timesheet.hours_work_type</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<![CDATA[
|
||||
<tree string="Hours per Work Type">
|
||||
<field name="work_type" select="1"/>
|
||||
<field name="hours" widget="float_time" sum="hours"/>
|
||||
</tree>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="hours_work_type_view_graph">
|
||||
<field name="model">timesheet.hours_work_type</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<![CDATA[
|
||||
<graph string="Hours per Work Type" type="pie">
|
||||
<x>
|
||||
<field name="work_type"/>
|
||||
</x>
|
||||
<y>
|
||||
<field name="hours"/>
|
||||
</y>
|
||||
</graph>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window" id="act_hours_work_type_form">
|
||||
<field name="name">Hours per Work Type</field>
|
||||
<field name="res_model">timesheet.hours_work_type</field>
|
||||
<field name="view_type">form</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view"
|
||||
id="act_hours_work_type_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="hours_work_type_view_tree"/>
|
||||
<field name="act_window" ref="act_hours_work_type_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view"
|
||||
id="act_hours_work_type_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="hours_work_type_view_graph"/>
|
||||
<field name="act_window" ref="act_hours_work_type_form"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="open_hours_work_type_init_view_form">
|
||||
<field name="model">timesheet.open_hours_work_type.init</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<![CDATA[
|
||||
<form string="Hours per Work Types">
|
||||
<label name="start_date"/>
|
||||
<field name="start_date"/>
|
||||
<label name="end_date"/>
|
||||
<field name="end_date"/>
|
||||
</form>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.action.wizard" id="act_open_hours_work_type">
|
||||
<field name="name">Hours per Work Type</field>
|
||||
<field name="wiz_name">timesheet.open_hours_work_type</field>
|
||||
</record>
|
||||
<menuitem parent="menu_reporting" action="act_open_hours_work_type"
|
||||
icon="STOCK_JUSTIFY_FILL" id="menu_open_hours_work_type"/>
|
||||
|
||||
<record model="ir.ui.view" id="hours_employee_view_tree">
|
||||
<field name="model">timesheet.hours_employee</field>
|
||||
<field name="type">tree</field>
|
||||
|
||||
@@ -159,3 +159,26 @@ class OpenWorkType(Wizard):
|
||||
return res
|
||||
|
||||
OpenWorkType()
|
||||
|
||||
|
||||
class OpenWorkType2(OpenWorkType):
|
||||
_name = 'timesheet.work_type.open2'
|
||||
|
||||
def _action_open_work_type(self, cursor, user, data, context=None):
|
||||
model_data_obj = self.pool.get('ir.model.data')
|
||||
act_window_obj = self.pool.get('ir.action.act_window')
|
||||
|
||||
model_data_ids = model_data_obj.search(cursor, user, [
|
||||
('fs_id', '=', 'act_work_type_form2'),
|
||||
('module', '=', 'timesheet'),
|
||||
], limit=1, context=context)
|
||||
model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
|
||||
context=context)
|
||||
res = act_window_obj.read(cursor, user, model_data.db_id, context=context)
|
||||
res['context'] = str({
|
||||
'from_date': data['form']['from_date'],
|
||||
'to_date': data['form']['to_date'],
|
||||
})
|
||||
return res
|
||||
|
||||
OpenWorkType2()
|
||||
|
||||
+38
-4
@@ -90,7 +90,6 @@
|
||||
<![CDATA[
|
||||
<tree string="Work Types">
|
||||
<field name="name" select="1"/>
|
||||
<field name="type" select="1"/>
|
||||
<field name="hours"/>
|
||||
</tree>
|
||||
]]>
|
||||
@@ -109,11 +108,46 @@
|
||||
<field name="act_window" ref="act_work_type_tree2"/>
|
||||
</record>
|
||||
<record model="ir.action.wizard" id="act_open_work_type">
|
||||
<field name="name">Open Work Types</field>
|
||||
<field name="name">Hours per Work Type</field>
|
||||
<field name="wiz_name">timesheet.work_type.open</field>
|
||||
</record>
|
||||
<menuitem parent="menu_timesheet" action="act_open_work_type"
|
||||
id="menu_work_type_tree2" icon="STOCK_INDENT" sequence="40"/>
|
||||
<menuitem parent="menu_reporting" action="act_open_work_type"
|
||||
id="menu_work_type_tree2" icon="STOCK_INDENT"/>
|
||||
|
||||
<record model="ir.ui.view" id="work_type_view_graph">
|
||||
<field name="model">timesheet.work_type</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<![CDATA[
|
||||
<graph string="Hours per Work Type" type="pie">
|
||||
<x>
|
||||
<field name="name"/>
|
||||
</x>
|
||||
<y>
|
||||
<field name="hours"/>
|
||||
</y>
|
||||
</graph>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window" id="act_work_type_form2">
|
||||
<field name="name">Hours per Work Type</field>
|
||||
<field name="res_model">timesheet.work_type</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="domain">[('parent', '=', False)]</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view"
|
||||
id="act_work_type_form2_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="work_type_view_graph"/>
|
||||
<field name="act_window" ref="act_work_type_form2"/>
|
||||
</record>
|
||||
<record model="ir.action.wizard" id="act_open_work_type2">
|
||||
<field name="name">Hours per Work Type</field>
|
||||
<field name="wiz_name">timesheet.work_type.open2</field>
|
||||
</record>
|
||||
<menuitem parent="menu_work_type_tree2" action="act_open_work_type2"
|
||||
id="menu_work_type_form2"/>
|
||||
|
||||
<record model="ir.model.access" id="access_work_type">
|
||||
<field name="model" search="[('model', '=', 'timesheet.work_type')]"/>
|
||||
|
||||
Reference in New Issue
Block a user