diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py
index 0672b28ba33..020d2740d4d 100644
--- a/addons/base_action_rule/base_action_rule.py
+++ b/addons/base_action_rule/base_action_rule.py
@@ -126,6 +126,10 @@ class base_action_rule(osv.osv):
obj.state = action.act_state
write['state'] = action.act_state
+ if hasattr(obj, 'categ_id') and action.act_categ_id:
+ obj.categ_id = action.act_categ_id
+ write['categ_id'] = action.act_categ_id.id
+
if hasattr(obj, 'priority') and action.act_priority:
obj.priority = action.act_priority
write['priority'] = action.act_priority
diff --git a/addons/base_action_rule/base_action_rule_view.xml b/addons/base_action_rule/base_action_rule_view.xml
index 71c84e3eaaa..9892886c675 100644
--- a/addons/base_action_rule/base_action_rule_view.xml
+++ b/addons/base_action_rule/base_action_rule_view.xml
@@ -2,9 +2,9 @@
-
-
base.action.rule.form
@@ -12,27 +12,28 @@
form
-
+
base.action.rule.tree
base.action.rule
tree
-
-
+
+
+
-
+
Action Rules
base.action.rule
@@ -40,10 +41,11 @@
tree,form
+
-
-
base.action.rule.line.form
@@ -54,34 +56,44 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
@@ -95,7 +107,7 @@
-
+
@@ -103,7 +115,7 @@
-
+
@@ -125,6 +137,15 @@
-
+
+
+
+
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 584762828f1..82ceb2aab70 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -38,7 +38,7 @@ months = {
def get_recurrent_dates(rrulestring, exdate, startdate=None):
def todate(date):
- val = parser.parse(''.join((re.compile('\d')).findall(date)) + 'Z')
+ val = parser.parse(''.join((re.compile('\d')).findall(date)))
return val
if not startdate:
startdate = datetime.now()
@@ -778,13 +778,15 @@ rule or repeating pattern for anexception to a recurrence set"),
def modify_this(self, cr, uid, ids, defaults, context=None, *args):
datas = self.read(cr, uid, ids[0], context=context)
- date = datas.get('date')
defaults.update({
'recurrent_uid': base_calendar_id2real_id(datas['id']),
'recurrent_id': defaults.get('date'),
'rrule_type': 'none',
'rrule': ''
})
+ exdate = datas['exdate'] and datas['exdate'].split(',') or []
+ exdate.append(defaults.get('date'))
+ self.write(cr, uid, ids, {'exdate': ','.join(exdate)}, context=context)
new_id = self.copy(cr, uid, ids[0], default=defaults, context=context)
return new_id
diff --git a/addons/caldav/caldav.py b/addons/caldav/caldav.py
index 6c416903959..3afcc28dd40 100644
--- a/addons/caldav/caldav.py
+++ b/addons/caldav/caldav.py
@@ -192,7 +192,12 @@ class CalDAV(object):
vals = alarm.import_cal(cr, uid, cal_data, context=ctx)
self.ical_set(cal_data.name.lower(), vals, 'value')
continue
+ if cal_data.name.lower() == 'exdate':
+ exval = map(lambda x: str(x), cal_data.value)
+ self.ical_set(cal_data.name.lower(), ','.join(exval), 'value')
+ continue
if cal_data.name.lower() in self.__attribute__:
+
if cal_data.params.get('X-VOBJ-ORIGINAL-TZID'):
self.ical_set('vtimezone', cal_data.params.get('X-VOBJ-ORIGINAL-TZID'), 'value')
self.ical_set(cal_data.name.lower(), cal_data.value, 'value')
@@ -248,15 +253,15 @@ class CalDAV(object):
data[map_field], ical, context=context)
elif data[map_field]:
if map_type in ("char", "text"):
- vevent.add(field).value = tools.ustr(data[map_field])
- elif map_type in ('datetime', 'date') and data[map_field]:
if field in ('exdate'):
- vevent.add(field).value = [parser.parse(data[map_field])]
+ vevent.add(field).value = map(parser.parse, (data[map_field]).split(','))
else:
- dtfield = vevent.add(field)
- dtfield.value = parser.parse(data[map_field])
- if tzval:
- dtfield.params['TZID'] = [tzval.title()]
+ vevent.add(field).value = tools.ustr(data[map_field])
+ elif map_type in ('datetime', 'date') and data[map_field]:
+ dtfield = vevent.add(field)
+ dtfield.value = parser.parse(data[map_field])
+ if tzval:
+ dtfield.params['TZID'] = [tzval.title()]
elif map_type == "timedelta":
vevent.add(field).value = timedelta(hours=data[map_field])
elif map_type == "many2one":
@@ -275,11 +280,13 @@ class CalDAV(object):
def check_import(self, cr, uid, vals, context={}):
ids = []
model_obj = self.pool.get(context.get('model'))
+ recur_pool = {}
try:
for val in vals:
exists, r_id = uid2openobjectid(cr, val['id'], context.get('model'), \
val.get('recurrent_id'))
if val.has_key('create_date'): val.pop('create_date')
+ u_id = val.get('id', None)
val.pop('id')
if exists and r_id:
val.update({'recurrent_uid': exists})
@@ -289,8 +296,14 @@ class CalDAV(object):
model_obj.write(cr, uid, [exists], val)
ids.append(exists)
else:
- event_id = model_obj.create(cr, uid, val)
- ids.append(event_id)
+ if u_id in recur_pool and val.get('recurrent_id'):
+ val.update({'recurrent_uid': recur_pool[u_id]})
+ revent_id = model_obj.create(cr, uid, val)
+ ids.append(revent_id)
+ else:
+ event_id = model_obj.create(cr, uid, val)
+ recur_pool[u_id] = event_id
+ ids.append(event_id)
except Exception, e:
raise osv.except_osv(('Error !'), (str(e)))
return ids
@@ -369,6 +382,7 @@ class Calendar(CalDAV, osv.osv):
def import_cal(self, cr, uid, content, data_id=None, context=None):
if not context:
context = {}
+ vals = []
ical_data = base64.decodestring(content)
parsedCal = vobject.readOne(ical_data)
if not data_id:
@@ -385,11 +399,12 @@ class Calendar(CalDAV, osv.osv):
})
self.__attribute__ = get_attribute_mapping(cr, uid, child.name.lower(), context=context)
val = self.parse_ics(cr, uid, child, cal_children=cal_children, context=context)
+ vals.append(val)
obj = self.pool.get(cal_children[child.name.lower()])
- if hasattr(obj, 'check_import'):
- obj.check_import(cr, uid, [val], context=context)
- else:
- self.check_import(cr, uid, [val], context=context)
+ if hasattr(obj, 'check_import'):
+ obj.check_import(cr, uid, vals, context=context)
+ else:
+ self.check_import(cr, uid, vals, context=context)
return {}
Calendar()
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 589e26d5521..7765f61ec32 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -606,6 +606,6 @@ class users(osv.osv):
_inherit = 'res.users'
_description = "Users"
_columns = {
- 'context_section_id': fields.many2one('crm.case.section', 'Sales Section'),
+ 'context_section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
users()
diff --git a/addons/crm/crm_action_rule.py b/addons/crm/crm_action_rule.py
index c3184ea4097..1e7c50588db 100644
--- a/addons/crm/crm_action_rule.py
+++ b/addons/crm/crm_action_rule.py
@@ -188,6 +188,7 @@ class base_action_rule_line(osv.osv):
'trg_categ_id': fields.many2one('crm.case.categ', 'Category'),
'regex_history' : fields.char('Regular Expression on Case History', size=128),
'act_section_id': fields.many2one('crm.case.section', 'Set section to'),
+ 'act_categ_id': fields.many2one('crm.case.categ', 'Set Category to'),
'act_mail_to_partner': fields.boolean('Mail to partner',help="Check this if you want the rule to send an email to the partner."),
}
diff --git a/addons/crm/crm_action_rule_view.xml b/addons/crm/crm_action_rule_view.xml
index 0cca1b22416..8fee80c86f2 100644
--- a/addons/crm/crm_action_rule_view.xml
+++ b/addons/crm/crm_action_rule_view.xml
@@ -1,6 +1,6 @@
-
+
base.action.rule.line.form.inherit
@@ -8,27 +8,32 @@
form
-
-
-
-
-
+
+
+
+
+
+
+
-
+
base.action.rule.line.form2.inherit
base.action.rule.line
form
-
-
-
-
+
+
+
+
+
+
+
-
+
base.action.rule.line.form3.inherit
base.action.rule.line
@@ -36,7 +41,8 @@
form
-
+
+
diff --git a/addons/crm/crm_claims_view.xml b/addons/crm/crm_claims_view.xml
index b82f57b88ca..e0fd5d90c80 100644
--- a/addons/crm/crm_claims_view.xml
+++ b/addons/crm/crm_claims_view.xml
@@ -36,6 +36,8 @@
+
+
diff --git a/addons/crm/crm_fund_view.xml b/addons/crm/crm_fund_view.xml
index 250f7473592..f7a45b1f082 100644
--- a/addons/crm/crm_fund_view.xml
+++ b/addons/crm/crm_fund_view.xml
@@ -37,7 +37,7 @@
-
+
@@ -197,7 +197,7 @@
-
+
+
@@ -172,12 +173,10 @@
/>
+
-
-
-
-
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index fdc55999297..907d2bdbb76 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -377,11 +377,10 @@
tree,form
-
+ parent="menu_hr_root"/>
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index 41056d70dbc..2166fab0093 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -21,6 +21,7 @@
import time
from osv import fields, osv
+from mx import DateTime as dt
class hr_evaluation_plan(osv.osv):
_name = "hr_evaluation.plan"
@@ -75,13 +76,36 @@ class hr_employee(osv.osv):
_inherit="hr.employee"
_columns = {
'evaluation_plan_id': fields.many2one('hr_evaluation.plan', 'Evaluation Plan'),
- 'evaluation_date': fields.date('Next Evaluation', help="Date of the next evaluation"),
+ 'evaluation_date': fields.date('Next Evaluation', help="Date of the next evaluation",readonly=True),
}
- def onchange_evaluation_plan_id(self, *args):
- # return the right evaluation date
- pass
+
+ def onchange_evaluation_plan_id(self,cr,uid,ids,evaluation_plan_id,context={}):
+ evaluation_date = self.browse(cr, uid, ids)[0].evaluation_date or ''
+ evaluation_plan_obj=self.pool.get('hr_evaluation.plan')
+ if evaluation_plan_id:
+ for evaluation_plan in evaluation_plan_obj.browse(cr,uid,[evaluation_plan_id]):
+ if not evaluation_date:
+ evaluation_date=(dt.ISO.ParseAny(dt.now().strftime('%Y-%m-%d'))+ dt.RelativeDateTime(months=+evaluation_plan.month_first)).strftime('%Y-%m-%d')
+ else:
+ evaluation_date=(dt.ISO.ParseAny(evaluation_date)+ dt.RelativeDateTime(months=+evaluation_plan.month_next)).strftime('%Y-%m-%d')
+ return {'value': {'evaluation_date':evaluation_date}}
hr_employee()
+class hr_evaluation_interview(osv.osv):
+ _name = "hr.evaluation.interview"
+ _inherit = "survey.request"
+
+ def default_get(self, cr, uid, fields, context={}):
+ data = super(hr_evaluation_interview, self).default_get(cr, uid, fields, context)
+ if context.has_key('phase_id'):
+ data['survey_id'] =self.pool.get('hr_evaluation.plan.phase').browse(cr, uid, context['phase_id']).survey_id.id
+ return data
+
+ _columns = {
+ 'user_to_review_id': fields.many2one('hr.employee', 'Employee'),
+ }
+hr_evaluation_interview()
+
class hr_evaluation(osv.osv):
_name = "hr_evaluation.evaluation"
_description = "Employee Evaluation"
@@ -89,7 +113,6 @@ class hr_evaluation(osv.osv):
_columns = {
'date': fields.date("Evaluation Deadline", required=True),
'employee_id': fields.many2one('hr.employee', "Employee", required=True),
- 'manager_id': fields.many2one('res.users', "Manager", required=True),
'note_summary': fields.text('Evaluation Summary'),
'note_action': fields.text('Action Plan',
help="If the evaluation does not meet the expectations, you can propose"+
@@ -101,7 +124,7 @@ class hr_evaluation(osv.osv):
('3','Exceeds expectations'),
('4','Significantly exceeds expectations'),
], "Overall Rating", help="This is the overall rating on that summarize the evaluation"),
- 'survey_request_ids': fields.many2many('survey.request',
+ 'survey_request_ids': fields.many2many('hr.evaluation.interview',
'hr_evaluation_evaluation_requests',
'evaluation_id',
'survey_id',
@@ -139,4 +162,3 @@ class hr_evaluation(osv.osv):
hr_evaluation()
-
diff --git a/addons/hr_evaluation/hr_evaluation_data.xml b/addons/hr_evaluation/hr_evaluation_data.xml
index 3e0b6137c7d..372b40a95f7 100644
--- a/addons/hr_evaluation/hr_evaluation_data.xml
+++ b/addons/hr_evaluation/hr_evaluation_data.xml
@@ -1577,13 +1577,23 @@ Once the form had been filled, the employee send it to his supervisor.
+
+
+
+ waiting_answer
+
+
+ fp@tinyerp.com
+ 2010-02-21
+
+
0
draft
-
+
2010-01-21
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml
index 58aa5f4a3fc..0a288e34078 100644
--- a/addons/hr_evaluation/hr_evaluation_view.xml
+++ b/addons/hr_evaluation/hr_evaluation_view.xml
@@ -106,7 +106,7 @@
-
+
@@ -123,13 +123,12 @@
-
-
+
@@ -169,7 +168,6 @@
-
@@ -182,5 +180,70 @@
name="Evaluation" parent="menu_eval_hr"
id="menu_open_view_hr_evaluation_tree"
action="open_view_hr_evaluation_tree"/>
+
+
+
+ hr_evaluation.interview.form
+ hr.evaluation.interview
+ form
+
+
+
+
+
+ hr_evaluation.interview.tree
+ hr.evaluation.interview
+ tree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ hr.evaluation.interview
+ form
+ tree,form
+
+
+
+
diff --git a/addons/mrp/__terp__.py b/addons/mrp/__terp__.py
index 93b9938b97a..dbd96f6c98e 100644
--- a/addons/mrp/__terp__.py
+++ b/addons/mrp/__terp__.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL ().
#
@@ -15,7 +15,7 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
+# along with this program. If not, see .
#
##############################################################################
@@ -26,7 +26,7 @@
"author" : "Tiny",
"website" : "http://www.openerp.com",
"category" : "Generic Modules/Production",
- "depends" : ["stock", "hr", "purchase", "product","process"],
+ "depends" : ["stock", "resource", "purchase", "product","process"],
"description": """
This is the base module to manage the manufacturing process in Open ERP.
diff --git a/addons/mrp/mrp_demo.xml b/addons/mrp/mrp_demo.xml
index 5d555412ec3..f0c1cfa5483 100644
--- a/addons/mrp/mrp_demo.xml
+++ b/addons/mrp/mrp_demo.xml
@@ -1,26 +1,24 @@
-
+
-
+
Assembly workshop
-
- hr
+
Repairs workshop
-
- hr
+
-
+
-
+
RAM
@@ -54,11 +52,11 @@
PSU
-
+
-
+
DDR 512MB PC400
@@ -140,7 +138,7 @@
-
+
@@ -160,11 +158,11 @@
3
assembly main + processor + fan
-
+
-
+
Regular processor config
@@ -173,7 +171,7 @@
normal
-
+
Assembly Basic+ PC
@@ -249,14 +247,14 @@
phantom
-
+
High Speed Processor + main board on demand
1.0
-
+
KIT
Kit Mouse
@@ -486,7 +484,7 @@
-
+
KIT
Kit Keyboard + Mouse
@@ -510,6 +508,6 @@
-
+
diff --git a/addons/project/__terp__.py b/addons/project/__terp__.py
index 0753ee91f96..cedeab01b4f 100644
--- a/addons/project/__terp__.py
+++ b/addons/project/__terp__.py
@@ -26,7 +26,7 @@
"author" : "Tiny",
"website" : "http://www.openerp.com",
"category" : "Generic Modules/Projects & Services",
- "depends" : ["product", "analytic", "hr", "process", "mail_gateway"],
+ "depends" : ["product", "analytic", "process", "mail_gateway"],
"description": """Project management module that track multi-level projects, tasks,
works done on tasks, eso. It is able to render planning, order tasks, eso.
""",
diff --git a/addons/project/project.py b/addons/project/project.py
index a0589ac76eb..7a412bfecfe 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -134,10 +134,6 @@ class project(osv.osv):
'warn_customer': fields.boolean('Warn Partner', help="If you check this, the user will have a popup when closing a task that propose a message to send by email to the customer."),
'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed."),
'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed."),
- 'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report"),
-# 'state': fields.selection([('template', 'Template'), ('open', 'Running'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', required=True, readonly=True,
-# help='The project can be in either if the states \'Template\' and \'Running\'.\n If it is template then we can make projects based on the template projects. If its in \'Running\' state it is a normal project.\
-# \n If it is to be reviewed then the state is \'Pending\'.\n When the project is completed the state is set to \'Done\'.'),
'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages'),
}
_order = "sequence"
@@ -256,25 +252,8 @@ class task(osv.osv):
res[task.id]['delay_hours'] = res[task.id]['total_hours'] - task.planned_hours
return res
- def onchange_planned(self, cr, uid, ids, project, user_id = False,planned=0.0, effective=0.0,date_start=None,occupation_rate=0.0):
- result = {}
- if date_start:
- resource_pool = self.pool.get('resource.resource')
- project_pool = self.pool.get('project.project')
- resource_calendar = self.pool.get('resource.calendar')
- dt_start = mx.DateTime.strptime(date_start,'%Y-%m-%d %H:%M:%S')
- resource_id = resource_pool.search(cr,uid,[('user_id','=',user_id)])
- if resource_id:
- resource_obj = resource_pool.browse(cr,uid,resource_id)[0]
- hrs = planned/(float(occupation_rate) * resource_obj.time_efficiency)
- calendar_id = resource_obj.calendar_id.id
- else:
- hrs = float(planned / occupation_rate)
- calendar_id = project_pool.browse(cr,uid,project).resource_calendar_id .id
- work_times = resource_calendar.interval_get(cr, uid, calendar_id or False, dt_start, hrs or 0.0,resource_id or False)
- result['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- result['remaining_hours'] = planned-effective
- return {'value':result}
+ def onchange_planned(self, cr, uid, ids, planned = 0.0, effective = 0.0):
+ return {'value':{'remaining_hours' : planned - effective}}
def _default_project(self, cr, uid, context={}):
if 'project_id' in context and context['project_id']:
@@ -315,7 +294,6 @@ class task(osv.osv):
'parent_ids': fields.many2many('project.task', 'project_task_parent_rel', 'task_id', 'parent_id', 'Parent Tasks'),
'child_ids': fields.many2many('project.task', 'project_task_parent_rel', 'parent_id', 'task_id', 'Delegated Tasks'),
'notes': fields.text('Notes'),
- 'occupation_rate': fields.float('Occupation Rate', help='The occupation rate fields indicates how much of his time a user is working on a task. A 100% occupation rate means the user works full time on the tasks. The ending date of a task is computed like this: Starting Date + Duration / Occupation Rate.'),
'planned_hours': fields.float('Planned Hours', required=True, help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'),
'effective_hours': fields.function(_hours_get, method=True, string='Hours Spent', multi='hours', store=True, help="Computed using the sum of the task work done."),
'remaining_hours': fields.float('Remaining Hours', digits=(16,4), help="Total remaining time, can be re-estimated periodically by the assignee of the task."),
@@ -339,7 +317,6 @@ class task(osv.osv):
'active': lambda *a: True,
'date_start': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'project_id': _default_project,
- 'occupation_rate':lambda *a: '1',
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c)
}
_order = "sequence, priority, date_start, id"
@@ -479,83 +456,6 @@ class task(osv.osv):
self.write(cr, uid, typ.id, {'type': index and types[index-1] or False})
return True
- def constraint_date_start(self,cr,uid,task,date_end,context=None):
- # Recursive call for all previous tasks if change in date_start < older time
-
- resource_cal_pool = self.pool.get('resource.calendar')
- resource_pool = self.pool.get('resource.resource')
- calendar_id = task.project_id.resource_calendar_id.id
- hours = task.remaining_hours / task.occupation_rate
- resource_id = resource_pool.search(cr,uid,[('user_id','=',task.user_id.id)])
- if resource_id:
- resource_obj = resource_pool.browse(cr,uid,resource_id[0])
- calendar_id = resource_obj.calendar_id.id
- hours = task.planned_hours/(float(task.occupation_rate) * resource_obj.time_efficiency)
- work_time = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, date_end, hours or 0.0,resource_id or False)
- dt_start = work_time[0][0].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr,uid,[task.id],{'date_start':dt_start,'date_end':date_end.strftime('%Y-%m-%d %H:%M:%S')})
-
- def constraint_date_end(self,cr,uid,task,date_start,context=None):
- # Recursive call for all next tasks if change in date_end > older time
-
- resource_cal_pool = self.pool.get('resource.calendar')
- resource_pool = self.pool.get('resource.resource')
- calendar_id = task.project_id.resource_calendar_id.id
- hours = task.remaining_hours / task.occupation_rate
- resource_id = resource_pool.search(cr,uid,[('user_id','=',task.user_id.id)])
- if resource_id:
- resource_obj = resource_pool.browse(cr,uid,resource_id[0])
- calendar_id = resource_obj.calendar_id.id
- hours = task.planned_hours/(float(task.occupation_rate) * resource_obj.time_efficiency)
- work_time = resource_cal_pool.interval_get(cr, uid, calendar_id or False, date_start, hours or 0.0,resource_id or False)
- dt_end = work_time[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr,uid,[task.id],{'date_start':date_start.strftime('%Y-%m-%d %H:%M:%S'),'date_end':dt_end})
-
- def write_old(self, cr, uid, ids, vals,context=None):
-
- if not context:
- context = {}
-
- if context.get('scheduler',False):
- return super(task, self).write(cr, uid, ids, vals, context=context)
-
-# if the task is performed by a resource then its calendar and efficiency also taken
-# otherwise the project's working calendar considered
- tasks = self.browse(cr,uid,ids[0])
- resource_cal_pool = self.pool.get('resource.calendar')
- resource_pool = self.pool.get('resource.resource')
- calendar_id = tasks.project_id.resource_calendar_id.id
- hrs = tasks.remaining_hours / tasks.occupation_rate
- resource_id = resource_pool.search(cr,uid,[('user_id','=',tasks.user_id.id)])
- if resource_id:
- resource_obj = resource_pool.browse(cr,uid,resource_id[0])
- calendar_id = resource_obj.calendar_id.id
- hrs = tasks.planned_hours/(float(tasks.occupation_rate) * resource_obj.time_efficiency)
-
-# write method changes the date_start and date_end
-# for previous and next tasks respectively based on valid condition
- if vals.get('date_start'):
- if vals['date_start'] < tasks.date_start:
- dt_start = mx.DateTime.strptime(vals['date_start'],'%Y-%m-%d %H:%M:%S')
- work_times = resource_cal_pool.interval_get(cr, uid, calendar_id or False, dt_start, hrs or 0.0,resource_id or False)
- vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- super(task, self).write(cr, uid, ids, vals, context=context)
-
- for prv_task in tasks.parent_ids:
- self.constraint_date_start(cr,uid,prv_task,dt_start)
-
- if vals.get('date_end'):
- if vals['date_end'] > tasks.date_end:
- dt_end = mx.DateTime.strptime(vals['date_end'],'%Y-%m-%d %H:%M:%S')
- hrs = tasks.remaining_hours / tasks.occupation_rate
- work_times = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, dt_end, hrs or 0.0,resource_id or False)
- vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
- super(task, self).write(cr, uid, ids, vals, context=context)
-
- for next_task in tasks.child_ids:
- self.constraint_date_end(cr,uid,next_task,dt_end)
- return super(task, self).write(cr, uid, ids, vals, context=context)
-
task()
class project_work(osv.osv):
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 72e12a81aa7..ef80a9e0f1c 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -25,8 +25,7 @@
-
-
+
@@ -247,7 +246,7 @@
name="planned_hours"
widget="float_time"
attrs="{'readonly':[('state','!=','draft')]}"
- on_change="onchange_planned(project_id,user_id,planned_hours,effective_hours,date_start,occupation_rate)"/>
+ on_change="onchange_planned(planned_hours, effective_hours)"/>
@@ -304,7 +303,6 @@
-
@@ -331,7 +329,7 @@
-
+
@@ -404,8 +402,7 @@
-
-
+
@@ -413,7 +410,8 @@
-
+
+
diff --git a/addons/project/project_wizard.xml b/addons/project/project_wizard.xml
index 408d2d45b44..e2b7442f26e 100644
--- a/addons/project/project_wizard.xml
+++ b/addons/project/project_wizard.xml
@@ -3,16 +3,6 @@
-
-
-
-
-
phase['constraint_date_end']:
+ return False
+ return True
_columns = {
'name': fields.char("Phase Name", size=64, required=True),
@@ -110,52 +123,55 @@ class project_phase(osv.osv):
_order = "name"
_constraints = [
(_check_recursion,'Error ! Loops In Phases Not Allowed',['next_phase_ids','previous_phase_ids']),
- (_check_dates, 'Error! Phase start-date must be lower then Phase end-date.', ['date_start', 'date_end'])
+ (_check_dates, 'Error! Phase start-date must be lower then Phase end-date.', ['date_start', 'date_end']),
+ (_check_constraint_start, 'Error! Phase must start-after Constraint Start Date.', ['date_start', 'constraint_date_start']),
+ (_check_constraint_end, 'Error! Phase must end-before Constraint End Date.', ['date_end', 'constraint_date_end']),
+
]
- def onchange_project(self,cr,uid,ids,project):
+ def onchange_project(self, cr, uid, ids, project):
result = {}
if project:
project_pool = self.pool.get('project.project')
- project_id = project_pool.browse(cr,uid,project)
+ project_id = project_pool.browse(cr, uid, project)
if project_id.date_start:
- result['date_start'] = mx.DateTime.strptime(project_id.date_start,"%Y-%m-%d").strftime('%Y-%m-%d %H:%M:%S')
- return {'value':result}
- return {'value':{'date_start':[]}}
+ result['date_start'] = mx.DateTime.strptime(project_id.date_start, "%Y-%m-%d").strftime('%Y-%m-%d %H:%M:%S')
+ return {'value' : result}
+ return {'value' : {'date_start' : []}}
- def constraint_date_start(self,cr,uid,phase,date_end,context=None):
+ def constraint_date_start(self, cr, uid, phase, date_end, context=None):
# Recursive call for all previous phases if change in date_start < older time
resource_cal_pool = self.pool.get('resource.calendar')
uom_pool = self.pool.get('product.uom')
resource_pool = self.pool.get('resource.resource')
calendar_id = phase.project_id.resource_calendar_id.id
- if phase.responsible_id.id:
- resource_id = resource_pool.search(cr,uid,[('user_id','=',phase.responsible_id.id)])
- calendar_id = resource_pool.browse(cr,uid,resource_id[0]).calendar_id.id
- default_uom_id = uom_pool.search(cr,uid,[('name','=','Hour')])[0]
- avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration,default_uom_id)
- work_time = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, date_end, avg_hours or 0.0,resource_id or False)
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',phase.responsible_id.id)])
+ if resource_id:
+ calendar_id = resource_pool.browse(cr, uid, resource_id[0]).calendar_id.id
+ default_uom_id = uom_pool.search(cr, uid, [('name','=','Hour')])[0]
+ avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id)
+ work_time = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, date_end, avg_hours or 0.0, resource_id or False)
dt_start = work_time[0][0].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr,uid,[phase.id],{'date_start':dt_start,'date_end':date_end.strftime('%Y-%m-%d %H:%M:%S')})
+ self.write(cr, uid, [phase.id], {'date_start' : dt_start, 'date_end' : date_end.strftime('%Y-%m-%d %H:%M:%S')})
- def constraint_date_end(self,cr,uid,phase,date_start,context=None):
+ def constraint_date_end(self, cr, uid, phase, date_start, context=None):
# Recursive call for all next phases if change in date_end > older time
resource_cal_pool = self.pool.get('resource.calendar')
uom_pool = self.pool.get('product.uom')
resource_pool = self.pool.get('resource.resource')
calendar_id = phase.project_id.resource_calendar_id.id
- if phase.responsible_id.id:
- resource_id = resource_pool.search(cr,uid,[('user_id','=',phase.responsible_id.id)])
- calendar_id = resource_pool.browse(cr,uid,resource_id[0]).calendar_id.id
- default_uom_id = uom_pool.search(cr,uid,[('name','=','Hour')])[0]
- avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration,default_uom_id)
- work_time = resource_cal_pool.interval_get(cr, uid, calendar_id or False, date_start, avg_hours or 0.0,resource_id or False)
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',phase.responsible_id.id)])
+ if resource_id:
+ calendar_id = resource_pool.browse(cr, uid, resource_id[0]).calendar_id.id
+ default_uom_id = uom_pool.search(cr, uid, [('name','=','Hour')])[0]
+ avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id)
+ work_time = resource_cal_pool.interval_get(cr, uid, calendar_id or False, date_start, avg_hours or 0.0, resource_id or False)
dt_end = work_time[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr,uid,[phase.id],{'date_start':date_start.strftime('%Y-%m-%d %H:%M:%S'),'date_end':dt_end})
+ self.write(cr, uid, [phase.id], {'date_start' : date_start.strftime('%Y-%m-%d %H:%M:%S'), 'date_end' : dt_end})
- def write(self, cr, uid, ids, vals,context=None):
+ def write(self, cr, uid, ids, vals, context=None):
if not context:
context = {}
@@ -165,19 +181,17 @@ class project_phase(osv.osv):
# if the phase is performed by a resource then its calendar and efficiency also taken
# otherwise the project's working calendar considered
- phase = self.browse(cr,uid,ids[0])
+ phase = self.browse(cr, uid, ids[0])
resource_cal_pool = self.pool.get('resource.calendar')
resource_pool = self.pool.get('resource.resource')
uom_pool = self.pool.get('product.uom')
resource_id = False
calendar_id = phase.project_id.resource_calendar_id.id
-
- if phase.responsible_id.id:
- resource_id = resource_pool.search(cr,uid,[('user_id','=',phase.responsible_id.id)])
- if resource_id:
- calendar_id = resource_pool.browse(cr,uid,resource_id[0]).calendar_id.id
- default_uom_id = uom_pool.search(cr,uid,[('name','=','Hour')])[0]
- avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration,default_uom_id)
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',phase.responsible_id.id)])
+ if resource_id:
+ calendar_id = resource_pool.browse(cr, uid, resource_id[0]).calendar_id.id
+ default_uom_id = uom_pool.search(cr, uid, [('name','=','Hour')])[0]
+ avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id)
# write method changes the date_start and date_end
#for previous and next phases respectively based on valid condition
@@ -185,22 +199,22 @@ class project_phase(osv.osv):
if vals.get('date_start'):
if vals['date_start'] < phase.date_start:
dt_start = mx.DateTime.strptime(vals['date_start'],'%Y-%m-%d %H:%M:%S')
- work_times = resource_cal_pool.interval_get(cr, uid, calendar_id or False, dt_start, avg_hours or 0.0,resource_id or False)
+ work_times = resource_cal_pool.interval_get(cr, uid, calendar_id or False, dt_start, avg_hours or 0.0, resource_id or False)
vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
super(project_phase, self).write(cr, uid, ids, vals, context=context)
for prv_phase in phase.previous_phase_ids:
- self.constraint_date_start(cr,uid,prv_phase,dt_start)
+ self.constraint_date_start(cr, uid, prv_phase, dt_start)
if vals.get('date_end'):
if vals['date_end'] > phase.date_end:
dt_end = mx.DateTime.strptime(vals['date_end'],'%Y-%m-%d %H:%M:%S')
- work_times = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, dt_end, avg_hours or 0.0,resource_id or False)
+ work_times = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, dt_end, avg_hours or 0.0, resource_id or False)
vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
super(project_phase, self).write(cr, uid, ids, vals, context=context)
for next_phase in phase.next_phase_ids:
- self.constraint_date_end(cr,uid,next_phase,dt_end)
+ self.constraint_date_end(cr, uid, next_phase, dt_end)
return super(project_phase, self).write(cr, uid, ids, vals, context=context)
@@ -245,7 +259,8 @@ class project(osv.osv):
_inherit = "project.project"
_columns = {
- 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases")
+ 'phase_ids': fields.one2many('project.phase', 'project_id', "Project Phases"),
+ 'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report"),
}
project()
@@ -254,8 +269,112 @@ class task(osv.osv):
_inherit = "project.task"
_columns = {
- 'phase_id': fields.many2one('project.phase', 'Project Phase')
+ 'phase_id': fields.many2one('project.phase', 'Project Phase'),
+ 'occupation_rate': fields.float('Occupation Rate', help='The occupation rate fields indicates how much of his time a user is working on a task. A 100% occupation rate means the user works full time on the tasks. The ending date of a task is computed like this: Starting Date + Duration / Occupation Rate.'),
+ 'planned_hours': fields.float('Planned Hours', required=True, help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'),
}
+ _defaults = {
+ 'occupation_rate':lambda *a: '1'
+ }
+
+ def onchange_planned(self, cr, uid, ids, project, user_id=False, planned=0.0, effective=0.0, date_start=None, occupation_rate=0.0):
+ result = {}
+ if date_start:
+ resource_pool = self.pool.get('resource.resource')
+ project_pool = self.pool.get('project.project')
+ resource_calendar = self.pool.get('resource.calendar')
+ dt_start = mx.DateTime.strptime(date_start, '%Y-%m-%d %H:%M:%S')
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',user_id)])
+ if resource_id:
+ resource_obj = resource_pool.browse(cr, uid, resource_id)[0]
+ hrs = planned / (float(occupation_rate) * resource_obj.time_efficiency)
+ calendar_id = resource_obj.calendar_id.id
+ else:
+ hrs = float(planned / float(occupation_rate))
+ calendar_id = project_pool.browse(cr, uid, project).resource_calendar_id .id
+ work_times = resource_calendar.interval_get(cr, uid, calendar_id or False, dt_start, hrs or 0.0, resource_id or False)
+ result['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
+ result['remaining_hours'] = planned - effective
+ return {'value' : result}
+
+ def constraint_date_start(self, cr, uid, task, date_end, context=None):
+ # Recursive call for all previous tasks if change in date_start < older time
+
+ resource_cal_pool = self.pool.get('resource.calendar')
+ resource_pool = self.pool.get('resource.resource')
+ calendar_id = task.project_id.resource_calendar_id.id
+ hours = task.remaining_hours / task.occupation_rate
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',task.user_id.id)])
+ if resource_id:
+ resource_obj = resource_pool.browse(cr, uid, resource_id[0])
+ calendar_id = resource_obj.calendar_id.id
+ hours = task.planned_hours / (float(task.occupation_rate) * resource_obj.time_efficiency)
+ work_time = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, date_end, hours or 0.0, resource_id or False)
+ dt_start = work_time[0][0].strftime('%Y-%m-%d %H:%M:%S')
+ self.write(cr, uid, [task.id], {'date_start' : dt_start,'date_end' : date_end.strftime('%Y-%m-%d %H:%M:%S')})
+
+ def constraint_date_end(self, cr, uid, task, date_start, context=None):
+ # Recursive call for all next tasks if change in date_end > older time
+
+ resource_cal_pool = self.pool.get('resource.calendar')
+ resource_pool = self.pool.get('resource.resource')
+ calendar_id = task.project_id.resource_calendar_id.id
+ hours = task.remaining_hours / task.occupation_rate
+ resource_id = resource_pool.search(cr,uid,[('user_id','=',task.user_id.id)])
+ if resource_id:
+ resource_obj = resource_pool.browse(cr, uid, resource_id[0])
+ calendar_id = resource_obj.calendar_id.id
+ hours = task.planned_hours / (float(task.occupation_rate) * resource_obj.time_efficiency)
+ work_time = resource_cal_pool.interval_get(cr, uid, calendar_id or False, date_start, hours or 0.0, resource_id or False)
+ dt_end = work_time[-1][1].strftime('%Y-%m-%d %H:%M:%S')
+ self.write(cr, uid, [task.id], {'date_start' : date_start.strftime('%Y-%m-%d %H:%M:%S'),'date_end' : dt_end})
+
+ def write(self, cr, uid, ids, vals, context=None):
+
+ if not context:
+ context = {}
+
+ if context.get('scheduler',False):
+ return super(task, self).write(cr, uid, ids, vals, context=context)
+
+# if the task is performed by a resource then its calendar and efficiency also taken
+# otherwise the project's working calendar considered
+ tasks = self.browse( cr, uid, ids[0])
+ resource_cal_pool = self.pool.get('resource.calendar')
+ resource_pool = self.pool.get('resource.resource')
+ calendar_id = tasks.project_id.resource_calendar_id.id
+ hrs = tasks.remaining_hours / tasks.occupation_rate
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',tasks.user_id.id)])
+ if resource_id:
+ resource_obj = resource_pool.browse(cr, uid, resource_id[0])
+ calendar_id = resource_obj.calendar_id.id
+ hrs = tasks.planned_hours / (float(tasks.occupation_rate) * resource_obj.time_efficiency)
+
+# write method changes the date_start and date_end
+# for previous and next tasks respectively based on valid condition
+ if vals.get('date_start'):
+ if vals['date_start'] < tasks.date_start:
+ dt_start = mx.DateTime.strptime(vals['date_start'],'%Y-%m-%d %H:%M:%S')
+ work_times = resource_cal_pool.interval_get(cr, uid, calendar_id or False, dt_start, hrs or 0.0, resource_id or False)
+ vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
+ super(task, self).write(cr, uid, ids, vals, context=context)
+
+ for prv_task in tasks.parent_ids:
+ self.constraint_date_start(cr, uid, prv_task, dt_start)
+
+ if vals.get('date_end'):
+ if vals['date_end'] > tasks.date_end:
+ dt_end = mx.DateTime.strptime(vals['date_end'],'%Y-%m-%d %H:%M:%S')
+ hrs = tasks.remaining_hours / tasks.occupation_rate
+ work_times = resource_cal_pool.interval_min_get(cr, uid, calendar_id or False, dt_end, hrs or 0.0, resource_id or False)
+ vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
+ super(task, self).write(cr, uid, ids, vals, context=context)
+
+ for next_task in tasks.child_ids:
+ self.constraint_date_end(cr, uid, next_task, dt_end)
+
+ return super(task, self).write(cr, uid, ids, vals, context=context)
+
task()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_long_term/project_demo.xml b/addons/project_long_term/project_demo.xml
index 9f94152141f..64dcb19c31e 100644
--- a/addons/project_long_term/project_demo.xml
+++ b/addons/project_long_term/project_demo.xml
@@ -34,7 +34,7 @@
manager1
-
+
en_US
@@ -49,7 +49,7 @@
manager2
-
+
en_US
@@ -64,7 +64,7 @@
USER1
-
+
en_US
@@ -79,7 +79,7 @@
user2
-
+
en_US
@@ -94,7 +94,7 @@
user_finance
-
+
en_US
@@ -109,7 +109,7 @@
user_design1
-
+
en_US
@@ -201,23 +201,13 @@
-
-
-
- Fabien Pinckaers
-
-
-
- user
-
-
Analyst
-
+
user
@@ -227,7 +217,7 @@
Programmer
-
+
user
@@ -237,7 +227,7 @@
Tester
-
+
user
@@ -247,7 +237,7 @@
Web Designer
-
+
user
@@ -271,7 +261,7 @@
OpenERP Website Development
-
+
@@ -284,7 +274,7 @@
- 2010-02-26 15:37:00
+ 2010-02-24 15:37:00
2010-03-10 15:33:00
@@ -293,7 +283,7 @@
Planning
- 2010-02-18 15:49:00
+ 2010-03-25 15:49:00
2010-02-18 15:48:00
draft
@@ -308,13 +298,13 @@
Web Design
- 2010-04-10 16:08:00
+ 2010-04-15 16:08:00
2010-04-01 16:02:00
draft
- 2010-04-01 16:08:00
+ 2010-03-09 16:00:00
2010-04-10 16:02:00
@@ -329,7 +319,7 @@
- 2010-04-14 16:11:00
+ 2010-03-10 16:11:00
2010-04-26 16:10:00
@@ -338,13 +328,13 @@
Website Deployment
- 2010-04-28 16:35:00
+ 2010-04-30 16:35:00
2010-04-26 16:35:00
draft
- 2010-04-27 16:35:00
+ 2010-03-10 16:35:00
2010-04-27 16:34:00
@@ -402,7 +392,7 @@
-
+
diff --git a/addons/project_long_term/project_view.xml b/addons/project_long_term/project_view.xml
index c7178c3f6d0..be7b8de5977 100644
--- a/addons/project_long_term/project_view.xml
+++ b/addons/project_long_term/project_view.xml
@@ -96,7 +96,7 @@
-
+
@@ -112,6 +112,44 @@
form
+
+ phase.project.form1
+ project.project
+ form
+
+
+
+
+
+
+
+
+
+
+ project.phase.task.form1
+ project.task
+ form
+
+
+
+
+
+
+
+
+
+
+ project.phase.task.form2
+ project.task
+ form
+
+
+
+
+
+
+
+
-
+
+
+
+
diff --git a/addons/project_long_term/wizard/__init__.py b/addons/project_long_term/wizard/__init__.py
index 236fc2892a3..fffe3ded100 100644
--- a/addons/project_long_term/wizard/__init__.py
+++ b/addons/project_long_term/wizard/__init__.py
@@ -20,7 +20,9 @@
##############################################################################
import compute_phases_date
+import compute_tasks_date
import schedule_tasks
+import project_resource
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_long_term/wizard/compute_phases_date.py b/addons/project_long_term/wizard/compute_phases_date.py
index 4a2054e4ff6..0ad554f3122 100644
--- a/addons/project_long_term/wizard/compute_phases_date.py
+++ b/addons/project_long_term/wizard/compute_phases_date.py
@@ -25,7 +25,7 @@ from tools.translate import _
import datetime
from resource.faces import *
from new import classobj
-import project.project_resource as proj
+import project_resource as proj
compute_form = """
"""
-def phase_schedule(cr,uid,phase,start_date,calendar_id=False):
+def phase_schedule(cr, uid, phase, start_date, calendar_id=False):
pool = pooler.get_pool(cr.dbname)
phase_pool = pool.get('project.phase')
resource_pool = pool.get('resource.resource')
@@ -53,13 +53,13 @@ def phase_schedule(cr,uid,phase,start_date,calendar_id=False):
resource_cal = False
phase_resource = False
if phase:
- resource_id = resource_pool.search(cr,uid,[('user_id','=',phase.responsible_id.id)])
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',phase.responsible_id.id)])
if resource_id:
- resource_obj = resource_pool.browse(cr,uid,resource_id)[0]
- leaves = proj.leaves_resource(cr,uid,calendar_id or False ,resource_id,resource_obj.calendar_id.id)
- phase_resource = classobj(str(resource_obj.name),(Resource,),{'__doc__':resource_obj.name,'__name__':resource_obj.name,'vacation':tuple(leaves),'efficiency':resource_obj.time_efficiency})
- default_uom_id = uom_pool.search(cr,uid,[('name','=','Hour')])[0]
- avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration,default_uom_id)
+ resource_obj = resource_pool.browse(cr, uid, resource_id)[0]
+ leaves = proj.leaves_resource(cr, uid, calendar_id or False , resource_id, resource_obj.calendar_id.id)
+ phase_resource = classobj(str(resource_obj.name), (Resource,), {'__doc__' : resource_obj.name, '__name__' : resource_obj.name, 'vacation' : tuple(leaves), 'efficiency' : resource_obj.time_efficiency})
+ default_uom_id = uom_pool.search(cr, uid, [('name','=','Hour')])[0]
+ avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id)
duration = str(avg_hours) + 'H'
# Creating a new project for each phase
@@ -69,8 +69,8 @@ def phase_schedule(cr,uid,phase,start_date,calendar_id=False):
resource = phase_resource
# If project has working calendar else the default one would be considered
if calendar_id:
- working_days = proj.compute_working_calendar(cr,uid,calendar_id)
- vacation = tuple(proj.leaves_resource(cr,uid,calendar_id))
+ working_days = proj.compute_working_calendar(cr, uid, calendar_id)
+ vacation = tuple(proj.leaves_resource(cr, uid, calendar_id))
def phase():
effort = duration
@@ -78,26 +78,25 @@ def phase_schedule(cr,uid,phase,start_date,calendar_id=False):
project = BalancedProject(Project)
s_date = project.phase.start.to_datetime()
e_date = project.phase.end.to_datetime()
-
# According to constraints on date start and date end on phase recalculation done
if phase.constraint_date_start and str(s_date) < phase.constraint_date_start:
- start_date = datetime.datetime.strptime(phase.constraint_date_start,'%Y-%m-%d %H:%M:%S')
+ start_date = datetime.datetime.strptime(phase.constraint_date_start, '%Y-%m-%d %H:%M:%S')
else:
start_date = s_date
if phase.constraint_date_end and str(e_date) > phase.constraint_date_end:
- end_date= datetime.datetime.strptime(phase.constraint_date_end,'%Y-%m-%d %H:%M:%S')
+ end_date= datetime.datetime.strptime(phase.constraint_date_end, '%Y-%m-%d %H:%M:%S')
date_start = phase.constraint_date_end[:-3]
else:
end_date = e_date
date_start = end_date
# Writing the dates back
- phase_pool.write(cr,uid,[phase.id],{'date_start':start_date.strftime('%Y-%m-%d %H:%M:%S'),'date_end':end_date.strftime('%Y-%m-%d %H:%M:%S')},context={'scheduler':True})
+ phase_pool.write(cr, uid, [phase.id], {'date_start' :start_date.strftime('%Y-%m-%d %H:%M:%S'), 'date_end' :end_date.strftime('%Y-%m-%d %H:%M:%S')}, context={'scheduler' :True})
# Recursive calling the next phases till all the phases are scheduled
for phase in phase.next_phase_ids:
if phase.state in ['draft','open','pending']:
- phase_schedule(cr,uid,phase,date_start,phase.project_id.resource_calendar_id.id or False)
+ phase_schedule(cr, uid, phase, date_start, phase.project_id.resource_calendar_id.id or False)
else:
continue
@@ -111,22 +110,22 @@ class wizard_compute_phases(wizard.interface):
# if project mentioned
if data['form']['project_id']:
- project_id = project_pool.browse(cr,uid,data['form']['project_id'])
- phase_ids = phase_pool.search(cr,uid,[('project_id','=',project_id.id),('state','in',['draft','open','pending']),('previous_phase_ids','=',False)])
+ project_id = project_pool.browse(cr, uid, data['form']['project_id'])
+ phase_ids = phase_pool.search(cr, uid, [('project_id','=',project_id.id), ('state','in',['draft','open','pending']), ('previous_phase_ids','=',False)])
# else all the draft,open,pending states phases taken
else:
- phase_ids = phase_pool.search(cr,uid,[('state','in',['draft','open','pending']),('previous_phase_ids','=',False)])
+ phase_ids = phase_pool.search(cr, uid,[('state','in',['draft','open','pending']), ('previous_phase_ids','=',False)])
phase_ids.sort()
- phase_objs = phase_pool.browse(cr,uid,phase_ids)
+ phase_objs = phase_pool.browse(cr, uid, phase_ids)
for phase in phase_objs:
start_date = phase.project_id.date_start
if not phase.project_id.date_start:
start_date = datetime.datetime.now().strftime("%Y-%m-%d")
- start_dt = datetime.datetime.strftime((datetime.datetime.strptime(start_date,"%Y-%m-%d")),"%Y-%m-%d %H:%M")
+ start_dt = datetime.datetime.strftime((datetime.datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d %H:%M")
calendar_id = phase.project_id.resource_calendar_id.id
- phase_schedule(cr,uid,phase,start_dt,calendar_id or False)
+ phase_schedule(cr, uid, phase, start_dt, calendar_id or False)
return {}
states = {
diff --git a/addons/project_long_term/wizard/compute_tasks_date.py b/addons/project_long_term/wizard/compute_tasks_date.py
new file mode 100644
index 00000000000..3cf865a48db
--- /dev/null
+++ b/addons/project_long_term/wizard/compute_tasks_date.py
@@ -0,0 +1,150 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import wizard
+import pooler
+from tools.translate import _
+import datetime
+from resource.faces import *
+from new import classobj
+import operator
+import project_resource as proj
+
+compute_form = """
+"""
+
+success_msg = """
+"""
+
+compute_fields = {
+ 'project_id': {'string':'Project', 'type':'many2one', 'relation': 'project.project', 'required':'True'},
+}
+
+class wizard_compute_tasks(wizard.interface):
+
+ def _compute_date(self, cr, uid, data, context):
+ pool = pooler.get_pool(cr.dbname)
+ project_pool = pool.get('project.project')
+ task_pool = pool.get('project.task')
+ resource_pool = pool.get('resource.resource')
+ user_pool = pool.get('res.users')
+ project_id = data['form']['project_id']
+ project = project_pool.browse(cr, uid, project_id)
+ task_ids = task_pool.search(cr, uid, [('project_id','=',project_id), ('state','in',['draft','open','pending'])])
+ if task_ids:
+ wktime_cal = []
+ task_ids.sort()
+ task_obj = task_pool.browse(cr, uid, task_ids)
+ calendar_id = project.resource_calendar_id.id
+ start_date = project.date_start
+ if not project.date_start:
+ start_date = datetime.datetime.now().strftime("%Y-%m-%d")
+ date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M")
+
+# To create resources which are the Project Members
+ resource_objs = []
+ for resource in project.members:
+ leaves = []
+ resource_id = resource_pool.search(cr, uid, [('user_id','=',resource.id)])
+ if resource_id:
+ resource_obj = resource_pool.browse(cr, uid, resource_id)[0]
+ leaves = proj.leaves_resource(cr, uid, calendar_id or False , resource_id, resource_obj.calendar_id.id)
+ resource_objs.append(classobj(str(resource.name), (Resource,), {'__doc__' : resource.name, '__name__' : resource.name, 'vacation' : tuple(leaves), 'efficiency' : resource_obj.time_efficiency}))
+
+ priority_dict = {'0' :1000, '1' :800, '2' :500, '3' :300,'4' :100}
+
+# To create dynamic no of tasks with the resource specified
+ def tasks_resource(j, eff, priorty=500, obj=None):
+ def task():
+ """
+ task is a dynamic method!
+ """
+ effort = eff
+ if obj:
+ resource = obj
+ priority = priorty
+ task.__doc__ = "TaskNO%d" %j
+ task.__name__ = "task%d" %j
+ return task
+
+# Creating the project with all the tasks and resources
+ def Project():
+ title = project.name
+ start = date_start
+ resource = reduce(operator.or_, resource_objs)
+ minimum_time_unit = 1
+
+# If project has calendar
+ if calendar_id:
+ working_days = proj.compute_working_calendar(cr, uid, calendar_id)
+ vacation = tuple(proj.leaves_resource(cr, uid, calendar_id))
+
+# Dynamic Creation of tasks
+ i = 0
+ for each_task in task_obj:
+ hours = str(each_task.planned_hours / each_task.occupation_rate)+ 'H'
+ if each_task.priority in priority_dict.keys():
+ priorty = priority_dict[each_task.priority]
+ if each_task.user_id:
+ for resource_object in resource_objs:
+ if resource_object.__name__ == each_task.user_id.name:
+ task = tasks_resource(i, hours, priorty, resource_object)
+ else:
+ task = tasks_resource(i, hours, priorty)
+ i += 1
+
+# Writing back the dates
+ project = BalancedProject(Project)
+ loop_no = 0
+ for t in project:
+ s_date = t.start.to_datetime()
+ e_date = t.end.to_datetime()
+ if loop_no == 0:
+ project_pool.write(cr, uid, [project_id], {'date' : e_date})
+ else:
+ user_id = user_pool.search(cr, uid, [('name','=',t.booked_resource[0].__name__)])
+ task_pool.write(cr, uid, [task_obj[loop_no-1].id], {'date_start' :s_date.strftime('%Y-%m-%d %H:%M:%S'), 'date_deadline' :e_date.strftime('%Y-%m-%d %H:%M:%S'), 'user_id' :user_id[0]}, context={'scheduler' :True})
+ loop_no +=1
+ return {}
+
+ states = {
+ 'init': {
+ 'actions': [],
+ 'result': {'type':'form', 'arch':compute_form, 'fields':compute_fields, 'state':[
+ ('end', 'Cancel'),
+ ('compute', 'Compute')
+ ]},
+ },
+
+
+ 'compute': {
+ 'actions': [_compute_date],
+ 'result': {'type':'form','arch':success_msg,'fields':{}, 'state':[('end', 'Ok')]},
+ }
+ }
+wizard_compute_tasks('wizard.compute.tasks')
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_long_term/wizard/project_resource.py b/addons/project_long_term/wizard/project_resource.py
new file mode 100644
index 00000000000..c3bc686d980
--- /dev/null
+++ b/addons/project_long_term/wizard/project_resource.py
@@ -0,0 +1,81 @@
+import pooler
+import datetime
+
+def timeformat_convert(cr, uid, time_string, context={}):
+# Function to convert input time string:: 8.5 to output time string 8:30
+
+ split_list = str(time_string).split('.')
+ hour_part = split_list[0]
+ mins_part = split_list[1]
+ round_mins = int(round(float(mins_part) * 60,-2))
+ converted_string = hour_part + ':' + str(round_mins)[0:2]
+ return converted_string
+
+def leaves_resource(cr, uid, calendar_id, resource_id=False, resource_calendar=False):
+# To get the leaves for the resource_ids working on phase
+
+ pool = pooler.get_pool(cr.dbname)
+ resource_leaves_pool = pool.get('resource.calendar.leaves')
+ leaves = []
+ if resource_id:
+ resource_leave_ids = resource_leaves_pool.search(cr, uid, ['|', ('calendar_id','=',calendar_id), ('calendar_id','=',resource_calendar), ('resource_id','=',resource_id)])
+ else:
+ resource_leave_ids = resource_leaves_pool.search(cr, uid, [('calendar_id','=',calendar_id), ('resource_id','=',False)])
+ res_leaves = resource_leaves_pool.read(cr, uid, resource_leave_ids, ['date_from', 'date_to'])
+ for leave in range(len(res_leaves)):
+ dt_start = datetime.datetime.strptime(res_leaves[leave]['date_from'], '%Y-%m-%d %H:%M:%S')
+ dt_end = datetime.datetime.strptime(res_leaves[leave]['date_to'], '%Y-%m-%d %H:%M:%S')
+ no = dt_end - dt_start
+ [leaves.append((dt_start + datetime.timedelta(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))]
+ leaves.sort()
+ return leaves
+
+def compute_working_calendar(cr, uid, calendar_id):
+# To change the format of working calendar to bring it into 'faces' format
+
+ pool = pooler.get_pool(cr.dbname)
+ resource_week_pool = pool.get('resource.calendar.week')
+ time_range = "8:00-8:00"
+ non_working = ""
+ wk = {"0":"mon","1":"tue","2":"wed","3":"thu","4":"fri","5":"sat","6":"sun"}
+ wk_days = {}
+ wk_time = {}
+ wktime_list = []
+ wktime_cal = []
+ week_ids = resource_week_pool.search(cr, uid, [('calendar_id','=',calendar_id)])
+ week_obj = resource_week_pool.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'])
+
+# Converting time formats into appropriate format required
+# and creating a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')]
+ for week in week_obj:
+ res_str = ""
+ if wk.has_key(week['dayofweek']):
+ day = wk[week['dayofweek']]
+ wk_days[week['dayofweek']] = wk[week['dayofweek']]
+
+ hour_from_str = timeformat_convert(cr, uid, week['hour_from'])
+ hour_to_str = timeformat_convert(cr, uid, week['hour_to'])
+ res_str = hour_from_str + '-' + hour_to_str
+ wktime_list.append((day, res_str))
+
+# Converting it to format like [('mon', '8:00-12:00', '13:00-18:00')]
+ for item in wktime_list:
+ if wk_time.has_key(item[0]):
+ wk_time[item[0]].append(item[1])
+ else:
+ wk_time[item[0]] = [item[0]]
+ wk_time[item[0]].append(item[1])
+
+ for k,v in wk_time.items():
+ wktime_cal.append(tuple(v))
+
+# For non working days adding [('tue,wed,fri,sat,sun', '8:00-8:00')]
+ for k,v in wk_days.items():
+ if wk.has_key(k):
+ wk.pop(k)
+ for v in wk.itervalues():
+ non_working += v + ','
+ if non_working:
+ wktime_cal.append((non_working[:-1], time_range))
+
+ return wktime_cal
\ No newline at end of file
diff --git a/addons/project_long_term/wizard/schedule_tasks.py b/addons/project_long_term/wizard/schedule_tasks.py
index ea30718d616..ac968e276f6 100644
--- a/addons/project_long_term/wizard/schedule_tasks.py
+++ b/addons/project_long_term/wizard/schedule_tasks.py
@@ -27,14 +27,14 @@ from resource.faces import *
from new import classobj
import operator
import time
-import project.project_resource as proj
+import project_resource as proj
success_msg = """
"""
-def resource_list(cr,uid,phase):
+def resource_list(cr, uid, phase):
# To create resources which are the Project Members
resource_objs = []
@@ -43,9 +43,9 @@ def resource_list(cr,uid,phase):
leaves = []
resource_eff = res.time_efficiency
resource_cal = res.calendar_id.id
- wktime_cal = proj.compute_working_calendar(cr,uid,resource_cal)
- leaves = proj.leaves_resource(cr,uid,phase.project_id.resource_calendar_id.id or False ,res.id,resource_cal)
- resource_objs.append(classobj(str(res.user_id.name),(Resource,),{'__doc__':res.user_id.name,'__name__':res.user_id.name,'vacation':tuple(leaves),'efficiency':resource_eff}))
+ wktime_cal = proj.compute_working_calendar(cr, uid, resource_cal)
+ leaves = proj.leaves_resource(cr, uid, phase.project_id.resource_calendar_id.id or False , res.id, resource_cal)
+ resource_objs.append(classobj(str(res.user_id.name), (Resource,), {'__doc__' : res.user_id.name, '__name__' : res.user_id.name, 'vacation' : tuple(leaves), 'efficiency' : resource_eff}))
return resource_objs
class wizard_schedule_task(wizard.interface):
@@ -55,12 +55,12 @@ class wizard_schedule_task(wizard.interface):
phase_pool = pool.get('project.phase')
task_pool = pool.get('project.task')
user_pool = pool.get('res.users')
- phase = phase_pool.browse(cr,uid,data['id'])
- task_ids = map(lambda x:x.id,(filter(lambda x:x.state in ['open','draft','pending'] ,phase.task_ids)))
+ phase = phase_pool.browse(cr, uid, data['id'])
+ task_ids = map(lambda x : x.id, (filter(lambda x : x.state in ['open','draft','pending'] , phase.task_ids)))
if task_ids:
task_ids.sort()
- tasks = task_pool.browse(cr,uid,task_ids)
+ tasks = task_pool.browse(cr, uid, task_ids)
wktime_cal = []
start_date = str(phase.date_start)[:-9]
if not phase.date_start:
@@ -68,13 +68,13 @@ class wizard_schedule_task(wizard.interface):
start_date = datetime.datetime.now().strftime("%Y-%m-%d")
else:
start_date = phase.project_id.date_start
- date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date,"%Y-%m-%d"),"%Y-%m-%d %H:%M")
+ date_start = datetime.datetime.strftime(datetime.datetime.strptime(start_date, "%Y-%m-%d"), "%Y-%m-%d %H:%M")
calendar_id = phase.project_id.resource_calendar_id.id
- resource_objs = resource_list(cr,uid,phase)
- priority_dict = {'0':1000,'1':800,'2':500,'3':300,'4':100}
+ resource_objs = resource_list(cr, uid, phase)
+ priority_dict = {'0' :1000,'1' :800,'2' :500,'3' :300,'4' :100}
# To create dynamic no of tasks with the resource specified
- def tasks_resource(j,eff,priorty = 500,obj=False):
+ def tasks_resource(j, eff, priorty=500, obj=False):
def task():
"""
task is a dynamic method!
@@ -91,13 +91,13 @@ class wizard_schedule_task(wizard.interface):
def Project():
title = "Test Project"
start = date_start
- resource = reduce(operator.or_,resource_objs)
+ resource = reduce(operator.or_, resource_objs)
minimum_time_unit = 1
# If project has calendar
if calendar_id:
- working_days = proj.compute_working_calendar(cr,uid,calendar_id)
- vacation = tuple(proj.leaves_resource(cr,uid,calendar_id))
+ working_days = proj.compute_working_calendar(cr, uid, calendar_id)
+ vacation = tuple(proj.leaves_resource(cr, uid, calendar_id))
# Dynamic Creation of tasks
i = 0
@@ -108,9 +108,9 @@ class wizard_schedule_task(wizard.interface):
if each_task.user_id:
for resource_object in resource_objs:
if resource_object.__name__ == each_task.user_id.name:
- task = tasks_resource(i,hours,priorty,resource_object)
+ task = tasks_resource(i, hours, priorty, resource_object)
else:
- task = tasks_resource(i,hours,priorty)
+ task = tasks_resource(i, hours, priorty)
i += 1
# Writing back the dates
@@ -120,8 +120,8 @@ class wizard_schedule_task(wizard.interface):
s_date = t.start.to_datetime()
e_date = t.end.to_datetime()
if loop_no > 0:
- user_id = user_pool.search(cr,uid,[('name','=',t.booked_resource[0].__name__)])
- task_pool.write(cr,uid,[tasks[loop_no-1].id],{'date_start':s_date.strftime('%Y-%m-%d %H:%M:%S'),'date_deadline':e_date.strftime('%Y-%m-%d %H:%M:%S'),'user_id':user_id[0]},context={'scheduler':True})
+ user_id = user_pool.search(cr, uid, [('name','=',t.booked_resource[0].__name__)])
+ task_pool.write(cr, uid, [tasks[loop_no-1].id], {'date_start' :s_date.strftime('%Y-%m-%d %H:%M:%S'), 'date_deadline' :e_date.strftime('%Y-%m-%d %H:%M:%S'), 'user_id' :user_id[0]}, context={'scheduler' :True})
loop_no +=1
return {}
diff --git a/addons/project_planning/project_planning.py b/addons/project_planning/project_planning.py
index 96e6dd94bca..359fdd6887f 100644
--- a/addons/project_planning/project_planning.py
+++ b/addons/project_planning/project_planning.py
@@ -286,7 +286,7 @@ Business Days - (Time Allocation of Tasks + Time Allocation without Tasks + Holi
cr.execute(""" CREATE OR REPLACE VIEW report_account_analytic_planning_user AS (
SELECT
planning.id AS planning_id,
- planning.id::varchar(32) || '-' || COALESCE(users.id,0)::varchar(32) AS id,
+ (1000*(planning.id) + users.id)::integer AS id,
planning.business_days,
users.id AS user_id,
(SELECT sum(line1.amount_in_base_uom)
@@ -330,7 +330,7 @@ Business Days - (Time Allocation of Tasks + Time Allocation without Tasks + Holi
SELECT
planning.id AS planning_id,
- planning.id::varchar(32) || '-' || '0' AS id,
+ (1000*(planning.id) - 1)::integer AS id,
planning.business_days,
line.user_id,
(SELECT SUM(line1.amount_in_base_uom)
diff --git a/addons/report_crm/__terp__.py b/addons/report_crm/__terp__.py
index 9d9dae37390..7c051839560 100644
--- a/addons/report_crm/__terp__.py
+++ b/addons/report_crm/__terp__.py
@@ -24,13 +24,13 @@
'name': 'CRM Management - Reporting',
'version': '1.0',
'category': 'Generic Modules/CRM & SRM',
- 'description': """A module that adds new reports based on CRM cases.
- Case By section, Case By category""",
+ 'description': """A module that adds new reports based on Leads, Opportunities, Phonecalls, Claims, FunRising.
+ """,
'author': 'Tiny',
'website': 'http://www.openerp.com',
'depends': ['crm'],
'init_xml': [],
- 'update_xml': ['security/ir.model.access.csv',
+ 'update_xml': [#'security/ir.model.access.csv',
'report_crm_view.xml',
'report_crm_lead_view.xml',
'report_crm_claim_view.xml',
diff --git a/addons/report_crm/report_crm.py b/addons/report_crm/report_crm.py
index 8de833c2553..c9e22dc3af8 100644
--- a/addons/report_crm/report_crm.py
+++ b/addons/report_crm/report_crm.py
@@ -30,24 +30,56 @@ AVAILABLE_STATES = [
('pending','Pending')
]
-class report_crm_case_user(osv.osv):
- _name = "report.crm.case.user"
- _description = "Cases by user and section"
+class report_crm_case(osv.osv):
+ _name = "report.crm.case"
+ _description = "Cases and section"
_auto = False
+
+ def _get_data(self, cr, uid, ids, field_name, arg, context={}):
+ res = {}
+ state_perc = 0.0
+ avg_ans = 0.0
+
+ for case in self.browse(cr, uid, ids, context):
+ if field_name != 'avg_answers':
+ state = field_name[5:]
+ cr.execute("select count(*) from crm_opportunity where section_id =%s and state='%s'"%(case.section_id.id,state))
+ state_cases = cr.fetchone()[0]
+ perc_state = (state_cases / float(case.nbr_cases) ) * 100
+
+ res[case.id] = perc_state
+ else:
+ model_name = self._name.split('report.')
+ if len(model_name) < 2:
+ res[case.id] = 0.0
+ else:
+ model_name = model_name[1]
+
+ cr.execute("select count(*) from crm_case_log l, ir_model m where l.model_id=m.id and m.model = '%s'" , model_name)
+ logs = cr.fetchone()[0]
+
+ avg_ans = logs / case.nbr_cases
+ res[case.id] = avg_ans
+
+ return res
+
_columns = {
'name': fields.char('Year',size=64,required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
'nbr': fields.integer('# of Cases', readonly=True),
'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True),
+ 'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
+ 'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
+ 'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
}
_order = 'name desc, user_id'
def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_case_user')
+ tools.drop_view_if_exists(cr, 'report_crm_case')
cr.execute("""
- create or replace view report_crm_case_user as (
+ create or replace view report_crm_case as (
select
min(c.id) as id,
to_char(c.create_date, 'YYYY') as name,
@@ -60,68 +92,7 @@ class report_crm_case_user(osv.osv):
crm_case c
group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id
)""")
-report_crm_case_user()
-
-class report_crm_case_categ(osv.osv):
- _name = "report.crm.case.categ"
- _description = "Cases by section and category"
- _auto = False
- _columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
- 'nbr': fields.integer('# of Cases', readonly=True),
- 'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
- ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
- }
- _order = 'name desc'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_case_categ')
- cr.execute("""
- create or replace view report_crm_case_categ as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.state,
- c.section_id,
- count(*) as nbr
- from
- crm_case c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state,c.section_id
- )""")
-report_crm_case_categ()
-
-
-class report_crm_case_section(osv.osv):
- _name = "report.crm.case.section"
- _description = "Cases by Section"
- _auto = False
-
- _columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
-# 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
- 'nbr_cases': fields.integer('# of Cases', readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
- ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
- }
- _order = 'name desc'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_case_section')
- cr.execute("""
- create or replace view report_crm_case_section as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- count(*) as nbr_cases,
- c.section_id as section_id
- from
- crm_case c
- group by to_char(c.create_date, 'YYYY'),to_char(c.create_date, 'MM'), c.section_id
- )""")
-report_crm_case_section()
+report_crm_case()
class report_crm_case_service_dashboard(osv.osv):
_name = "report.crm.case.service.dashboard"
@@ -157,137 +128,6 @@ class report_crm_case_service_dashboard(osv.osv):
)""")
report_crm_case_service_dashboard()
-class report_crm_case_section_stage(osv.osv):
- _name = "report.crm.case.section.stage"
- _description = "Cases by section and stage"
- _auto = False
- _columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
- ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
- 'nbr': fields.integer('# of Cases', readonly=True),
- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
- }
- _order = 'section_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_stage")
- cr.execute("""
- create view report_crm_case_section_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.section_id,
- count(*) as nbr
- from
- crm_case c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.section_id)""")
-
-report_crm_case_section_stage()
-
-class report_crm_case_section_type(osv.osv):
- _name = "report.crm.case.section.type"
- _description = "Cases by Section and Type"
- _auto = False
- _columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
- ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
- 'nbr': fields.integer('# of Cases', readonly=True),
- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
- }
- _order = 'section_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_type")
- cr.execute("""
- create view report_crm_case_section_type as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.section_id,
- count(*) as nbr
- from
- crm_case c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.section_id, c.state)""")
-
-report_crm_case_section_type()
-
-class report_crm_case_section_categ_stage(osv.osv):
- _name = "report.crm.case.section.categ.stage"
- _description = "Cases by Section, Category and Stage"
- _auto = False
- _columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
- ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
- 'nbr': fields.integer('# of Cases', readonly=True),
- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
- }
- _order = 'section_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_categ_stage")
- cr.execute("""
- create view report_crm_case_section_categ_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.section_id,
- count(*) as nbr
- from
- crm_case c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.state, c.section_id)""")
-
-report_crm_case_section_categ_stage()
-
-class report_crm_case_section_categ_type(osv.osv):
- _name = "report.crm.case.section.categ.type"
- _description = "Cases by Section, Category and Type"
- _auto = False
- _columns = {
- 'name': fields.char('Year',size=64,required=False, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
- ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
- 'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
- 'nbr': fields.integer('# of Cases', readonly=True),
- 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
- }
- _order = 'section_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_case_section_categ_type")
- cr.execute("""
- create view report_crm_case_section_categ_type as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.section_id,
- count(*) as nbr
- from
- crm_case c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.state, c.section_id)""")
-
-report_crm_case_section_categ_type()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_crm/report_crm_claim.py b/addons/report_crm/report_crm_claim.py
index 2586ad2131e..e78f2c8aa51 100644
--- a/addons/report_crm/report_crm_claim.py
+++ b/addons/report_crm/report_crm_claim.py
@@ -1,237 +1,37 @@
from osv import fields,osv
import tools
-class report_crm_claim_user(osv.osv):
- _name = "report.crm.claim.user"
- _description = "Claim by user and section"
+class report_crm_claim(osv.osv):
+ _name = "report.crm.claim"
_auto = False
- _inherit = "report.crm.case.user"
+ _inherit = "report.crm.case"
_columns = {
- 'probability': fields.float('Avg. Probability', readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_costs': fields.float('Est.Cost', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
'delay_close': fields.char('Delay to close', size=20, readonly=True),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]"),
}
def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_claim_user')
+ tools.drop_view_if_exists(cr, 'report_crm_claim')
cr.execute("""
- create or replace view report_crm_claim_user as (
+ create or replace view report_crm_claim as (
select
min(c.id) as id,
to_char(c.create_date, 'YYYY') as name,
to_char(c.create_date, 'MM') as month,
c.state,
c.user_id,
+ c.stage_id,
c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_cost) as amount_costs,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_claim c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id
- )""")
-report_crm_claim_user()
-
-class report_crm_claim_categ(osv.osv):
- _name = "report.crm.claim.categ"
- _description = "Claim by section and category"
- _auto = False
- _inherit = "report.crm.case.categ"
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]"),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_costs': fields.float('Est.Cost', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
- 'probability': fields.float('Avg. Probability', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
-
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_claim_categ')
- cr.execute("""
- create or replace view report_crm_claim_categ as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
c.categ_id,
- c.state,
- c.section_id,
count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_cost) as amount_costs,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_claim c
- group by c.categ_id,to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state,c.section_id
- )""")
-report_crm_claim_categ()
-
-class report_crm_claim_section(osv.osv):
- _name = "report.crm.claim.section"
- _description = "Claim by Section"
- _auto = False
- _inherit = "report.crm.case.section"
-
- def _get_data(self, cr, uid, ids, field_name, arg, context={}):
- res = {}
- state_perc = 0.0
- avg_ans = 0.0
-
- for case in self.browse(cr, uid, ids, context):
- if field_name != 'avg_answers':
- state = field_name[5:]
- cr.execute("select count(*) from crm_claim where section_id =%s and state='%s'"%(case.section_id.id,state))
- state_cases = cr.fetchone()[0]
- perc_state = (state_cases / float(case.nbr_cases) ) * 100
-
- res[case.id] = perc_state
- else:
- cr.execute('select count(*) from crm_case_log l where l.section_id=%s'%(case.section_id.id))
- logs = cr.fetchone()[0]
-
- avg_ans = logs / case.nbr_cases
- res[case.id] = avg_ans
-
- return res
-
- _columns = {
- 'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
- 'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
- 'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
- 'delay_close': fields.char('Delay to close', size=20, readonly=True),
- }
- _order = 'name desc, section_id'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_claim_section')
- cr.execute("""
- create or replace view report_crm_claim_section as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- count(*) as nbr_cases,
- c.section_id as section_id,
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
from
crm_claim c
- group by to_char(c.create_date, 'YYYY'),to_char(c.create_date, 'MM'),c.section_id
+ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id, c.stage_id,c.categ_id
)""")
-report_crm_claim_section()
+report_crm_claim()
-class report_crm_claim_section_type(osv.osv):
- _name = "report.crm.claim.section.type"
- _inherit = "report.crm.case.section.type"
- _description = "Claims by section and type"
- _auto = False
- _columns = {
- 'type_id': fields.many2one('crm.case.resource.type', 'Claim Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_claim_section_type")
- cr.execute("""
- create view report_crm_claim_section_type as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.type_id,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_claim c
- where c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.type_id, c.section_id)""")
-
-report_crm_claim_section_type()
-
-class report_crm_claim_section_categ_stage(osv.osv):
- _name = "report.crm.claim.section.categ.stage"
- _inherit = "report.crm.case.section.categ.stage"
- _description = "Claims by Section, Category and Stage"
- _auto = False
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ','Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'stage_id, categ_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_claim_section_categ_stage")
- cr.execute("""
- create view report_crm_claim_section_categ_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_claim c
- where c.categ_id is not null AND c.stage_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_claim_section_categ_stage()
-
-class report_crm_claim_section_categ_type(osv.osv):
- _name = "report.crm.claim.section.categ.type"
- _inherit = "report.crm.case.section.categ.type"
- _description = "Claims by Section, Category and Type"
- _auto = False
- _columns = {
- 'categ_id':fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'type_id': fields.many2one('crm.case.resource.type', 'Claim Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.claim')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'categ_id, type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_claim_section_categ_type")
- cr.execute("""
- create view report_crm_claim_section_categ_type as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.type_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_claim c
- where c.categ_id is not null AND c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.type_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_claim_section_categ_type()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_crm/report_crm_claim_view.xml b/addons/report_crm/report_crm_claim_view.xml
index 43d57306596..8a9aa3d0273 100644
--- a/addons/report_crm/report_crm_claim_view.xml
+++ b/addons/report_crm/report_crm_claim_view.xml
@@ -1,29 +1,29 @@
-
-
+
-
- report.crm.claim.user.tree
- report.crm.claim.user
-
+
+ report.crm.claim.tree
+ report.crm.claim
tree
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
- report.crm.claim.user.form
- report.crm.claim.user
-
+
+ report.crm.claim.form
+ report.crm.claim
+
form
@@ -36,12 +36,12 @@
-
- report.crm.claim.user.graph
- report.crm.claim.user
+
+ report.crm.claim.graph
+ report.crm.claim
graph
-
+
@@ -49,379 +49,45 @@
-
- report.crm.claim.user.select
- report.crm.claim.user
-
+
+ report.crm.claim.select
+ report.crm.claim
+
search
-
+
-
- Claim by User and Section
- report.crm.claim.user
+
+
+ Claims
+ report.crm.claim
form
graph,tree
-
-
+
+
+
-
-
+
+
+
+ tree
+
+
+
+
+
+
+ graph
+
+
+
+
-
+
-
- report.crm.claim.categ.tree
- report.crm.claim.categ
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.claim.categ.form
- report.crm.claim.categ
-
- form
-
-
-
-
-
-
-
-
-
-
-
- report.crm.claim.categ.graph
- report.crm.claim.categ
- graph
-
-
-
-
-
-
-
-
-
-
- report.crm.claim.categ.select
- report.crm.claim.categ
-
- search
-
-
-
-
-
-
-
- Claims by Categories and Section
- report.crm.claim.categ
- form
- graph,tree
-
-
-
-
-
-
-
-
- report.crm.claim.section.tree
- report.crm.claim.section
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.claim.section.graph
- report.crm.claim.section
- graph
-
-
-
-
-
-
-
-
-
- report.crm.claim.section.select
- report.crm.claim.section
-
- search
-
-
-
-
-
-
-
- Claims by Section
- report.crm.claim.section
- form
- graph,tree
-
-
-
-
-
- #
- # Claims by section and type
- #
-
-
- CRM Report - Sections and Type(Tree)
- report.crm.claim.section.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Form)
- report.crm.claim.section.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Graph)
- report.crm.claim.section.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Select)
- report.crm.claim.section.type
-
- search
-
-
-
-
-
-
-
-
- report.crm.claim.section.type
- Claims by section and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Claims by section, category and stage
- #
-
-
- CRM Report - Section, Category and Stage(Tree)
- report.crm.claim.section.categ.stage
-
- tree
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Form)
- report.crm.claim.section.categ.stage
-
- form
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.claim.section.categ.stage
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.claim.section.categ.stage
-
- search
-
-
-
-
-
-
-
-
-
- report.crm.claim.section.categ.stage
- Claims by section, category and stage
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Claims by section, category and type
- #
-
-
- CRM Report - Section, Category and Type(Tree)
- report.crm.claim.section.categ.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Form)
- report.crm.claim.section.categ.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.claim.section.categ.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.claim.section.categ.type
-
- search
-
-
-
-
-
-
-
-
-
-
- report.crm.claim.section.categ.type
- Claims by section, category and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/addons/report_crm/report_crm_fundraising.py b/addons/report_crm/report_crm_fundraising.py
index 2cf752ea9ce..ef01c5246e5 100644
--- a/addons/report_crm/report_crm_fundraising.py
+++ b/addons/report_crm/report_crm_fundraising.py
@@ -1,12 +1,13 @@
from osv import fields,osv
import tools
-class report_crm_fundraising_user(osv.osv):
- _name = "report.crm.fundraising.user"
- _description = "Fundraising by user and section"
+class report_crm_fundraising(osv.osv):
+ _name = "report.crm.fundraising"
_auto = False
- _inherit = "report.crm.case.user"
+ _inherit = "report.crm.case"
_columns = {
+ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]"),
+ 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
'probability': fields.float('Avg. Probability', readonly=True),
'amount_revenue': fields.float('Est.Revenue', readonly=True),
'amount_costs': fields.float('Est.Cost', readonly=True),
@@ -14,9 +15,9 @@ class report_crm_fundraising_user(osv.osv):
'delay_close': fields.char('Delay to close', size=20, readonly=True),
}
def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_fundraising_user')
+ tools.drop_view_if_exists(cr, 'report_crm_fundraising')
cr.execute("""
- create or replace view report_crm_fundraising_user as (
+ create or replace view report_crm_fundraising as (
select
min(c.id) as id,
to_char(c.create_date, 'YYYY') as name,
@@ -24,214 +25,19 @@ class report_crm_fundraising_user(osv.osv):
c.state,
c.user_id,
c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_cost) as amount_costs,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_fundraising c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id
- )""")
-report_crm_fundraising_user()
-
-class report_crm_fundraising_categ(osv.osv):
- _name = "report.crm.fundraising.categ"
- _description = "Fundraising by section and category"
- _auto = False
- _inherit = "report.crm.case.categ"
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]"),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_costs': fields.float('Est.Cost', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
- 'probability': fields.float('Avg. Probability', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
-
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_fundraising_categ')
- cr.execute("""
- create or replace view report_crm_fundraising_categ as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
c.categ_id,
- c.state,
- c.section_id,
+ c.stage_id,
count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_cost) as amount_costs,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_fundraising c
- group by c.categ_id,to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state,c.section_id
- )""")
-report_crm_fundraising_categ()
-
-class report_crm_fundraising_section(osv.osv):
- _name = "report.crm.fundraising.section"
- _description = "Fundraising by Section"
- _auto = False
- _inherit = "report.crm.case.section"
-
- def _get_data(self, cr, uid, ids, field_name, arg, context={}):
- res = {}
- state_perc = 0.0
- avg_ans = 0.0
-
- for case in self.browse(cr, uid, ids, context):
- if field_name != 'avg_answers':
- state = field_name[5:]
- cr.execute("select count(*) from crm_fundraising where section_id =%s and state='%s'"%(case.section_id.id,state))
- state_cases = cr.fetchone()[0]
- perc_state = (state_cases / float(case.nbr_cases) ) * 100
-
- res[case.id] = perc_state
- else:
- cr.execute('select count(*) from crm_case_log l where l.section_id=%s'%(case.section_id.id))
- logs = cr.fetchone()[0]
-
- avg_ans = logs / case.nbr_cases
- res[case.id] = avg_ans
-
- return res
-
- _columns = {
- 'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
- 'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
- 'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
- 'delay_close': fields.char('Delay to close', size=20, readonly=True),
- }
- _order = 'name desc, section_id'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_fundraising_section')
- cr.execute("""
- create or replace view report_crm_fundraising_section as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- count(*) as nbr_cases,
- c.section_id as section_id,
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
+ sum(planned_revenue) as amount_revenue,
+ sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
+ avg(probability)::decimal(16,2) as probability,
to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
from
crm_fundraising c
- group by to_char(c.create_date, 'YYYY'),to_char(c.create_date, 'MM'),c.section_id
+ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id,c.categ_id,c.stage_id
)""")
-report_crm_fundraising_section()
-
-class report_crm_fundraising_section_type(osv.osv):
- _name = "report.crm.fundraising.section.type"
- _inherit = "report.crm.case.section.type"
- _description = "Fundraising by section and type"
- _auto = False
- _columns = {
- 'type_id': fields.many2one('crm.case.resource.type', 'Fundraising Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_fundraising_section_type")
- cr.execute("""
- create view report_crm_fundraising_section_type as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.type_id,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_fundraising c
- where c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.type_id, c.section_id)""")
-
-report_crm_fundraising_section_type()
-
-class report_crm_fundraising_section_categ_stage(osv.osv):
- _name = "report.crm.fundraising.section.categ.stage"
- _inherit = "report.crm.case.section.categ.stage"
- _description = "Fundraising by Section, Category and Stage"
- _auto = False
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ','Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'stage_id, categ_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_fundraising_section_categ_stage")
- cr.execute("""
- create view report_crm_fundraising_section_categ_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_fundraising c
- where c.categ_id is not null AND c.stage_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_fundraising_section_categ_stage()
-
-class report_crm_fundraising_section_categ_type(osv.osv):
- _name = "report.crm.fundraising.section.categ.type"
- _inherit = "report.crm.case.section.categ.type"
- _description = "Fundraising by Section, Category and Type"
- _auto = False
- _columns = {
- 'categ_id':fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'type_id': fields.many2one('crm.case.resource.type', 'Fundraising Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.fundraising')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'categ_id, type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_fundraising_section_categ_type")
- cr.execute("""
- create view report_crm_fundraising_section_categ_type as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.type_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_fundraising c
- where c.categ_id is not null AND c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.type_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_fundraising_section_categ_type()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+report_crm_fundraising()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_crm/report_crm_fundraising_view.xml b/addons/report_crm/report_crm_fundraising_view.xml
index bada63a0ae5..633023d3b4c 100644
--- a/addons/report_crm/report_crm_fundraising_view.xml
+++ b/addons/report_crm/report_crm_fundraising_view.xml
@@ -5,25 +5,32 @@
Fundraising by user and section
-->
-
- report.crm.fundraising.user.tree
- report.crm.fundraising.user
-
+
+ report.crm.fundraising.tree
+ report.crm.fundraising
tree
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
- report.crm.fundraising.user.form
- report.crm.fundraising.user
-
+
+ report.crm.fundraising.form
+ report.crm.fundraising
+
form
@@ -36,12 +43,12 @@
-
- report.crm.fundraising.user.graph
- report.crm.fundraising.user
+
+ report.crm.fundraising.graph
+ report.crm.fundraising
graph
-
+
@@ -49,378 +56,41 @@
-
- report.crm.fundraising.user.select
- report.crm.fundraising.user
-
+
+ report.crm.fundraising.select
+ report.crm.fundraising
+
search
-
+
-
- Fundraising by User and Section
- report.crm.fundraising.user
+
+ Fundraising
+ report.crm.fundraising
form
graph,tree
-
-
+
+
-
-
-
+
+
+
+ tree
+
+
+
-
- report.crm.fundraising.categ.tree
- report.crm.fundraising.categ
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.categ.form
- report.crm.fundraising.categ
-
- form
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.categ.graph
- report.crm.fundraising.categ
- graph
-
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.categ.select
- report.crm.fundraising.categ
-
- search
-
-
-
-
-
-
-
- Fundraising by Categories and Section
- report.crm.fundraising.categ
- form
- graph,tree
-
-
-
-
-
-
-
-
- report.crm.fundraising.section.tree
- report.crm.fundraising.section
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.section.graph
- report.crm.fundraising.section
- graph
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.section.select
- report.crm.fundraising.section
-
- search
-
-
-
-
-
-
-
- Fundraising by Section
- report.crm.fundraising.section
- form
- graph,tree
-
-
-
-
-
- #
- # Fundraising by section and type
- #
-
-
- CRM Report - Sections and Type(Tree)
- report.crm.fundraising.section.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Form)
- report.crm.fundraising.section.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Graph)
- report.crm.fundraising.section.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Select)
- report.crm.fundraising.section.type
-
- search
-
-
-
-
-
-
-
-
- report.crm.fundraising.section.type
- Fundraising by section and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Fundraising by section, category and stage
- #
-
-
- CRM Report - Section, Category and Stage(Tree)
- report.crm.fundraising.section.categ.stage
-
- tree
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Form)
- report.crm.fundraising.section.categ.stage
-
- form
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.fundraising.section.categ.stage
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.fundraising.section.categ.stage
-
- search
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.section.categ.stage
- Fundraising by section, category and stage
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Fundraising by section, category and type
- #
-
-
- CRM Report - Section, Category and Type(Tree)
- report.crm.fundraising.section.categ.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Form)
- report.crm.fundraising.section.categ.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.fundraising.section.categ.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.fundraising.section.categ.type
-
- search
-
-
-
-
-
-
-
-
-
-
- report.crm.fundraising.section.categ.type
- Fundraising by section, category and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
+
+
+ graph
+
+
+
+
+
+
diff --git a/addons/report_crm/report_crm_lead.py b/addons/report_crm/report_crm_lead.py
index 479b93445c4..2f170bd1825 100644
--- a/addons/report_crm/report_crm_lead.py
+++ b/addons/report_crm/report_crm_lead.py
@@ -1,273 +1,36 @@
from osv import fields,osv
import tools
-class report_crm_lead_user(osv.osv):
- _name = "report.crm.lead.user"
- _description = "Leads by user and section"
+class report_crm_lead(osv.osv):
+ _name = "report.crm.lead"
_auto = False
- _inherit = "report.crm.case.user"
+ _inherit = "report.crm.case"
_columns = {
- 'probability': fields.float('Avg. Probability', readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_costs': fields.float('Est.Cost', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
'delay_close': fields.char('Delay to close', size=20, readonly=True),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]"),
+ 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
}
def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_lead_user')
+ tools.drop_view_if_exists(cr, 'report_crm_lead')
cr.execute("""
- create or replace view report_crm_lead_user as (
+ create or replace view report_crm_lead as (
select
min(c.id) as id,
to_char(c.create_date, 'YYYY') as name,
to_char(c.create_date, 'MM') as month,
c.state,
c.user_id,
+ c.stage_id,
c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_cost) as amount_costs,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_lead c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id
- )""")
-report_crm_lead_user()
-
-class report_crm_lead_categ(osv.osv):
- _name = "report.crm.lead.categ"
- _description = "Leads by section and category"
- _auto = False
- _inherit = "report.crm.case.categ"
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]"),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_costs': fields.float('Est.Cost', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
- 'probability': fields.float('Avg. Probability', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
-
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_lead_categ')
- cr.execute("""
- create or replace view report_crm_lead_categ as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
c.categ_id,
- c.state,
- c.section_id,
count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_cost) as amount_costs,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_lead c
- group by c.categ_id,to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state,c.section_id
- )""")
-report_crm_lead_categ()
-
-class report_crm_lead_section(osv.osv):
- _name = "report.crm.lead.section"
- _description = "Leads by Section"
- _auto = False
- _inherit = "report.crm.case.section"
-
- def _get_data(self, cr, uid, ids, field_name, arg, context={}):
- res = {}
- state_perc = 0.0
- avg_ans = 0.0
-
- for case in self.browse(cr, uid, ids, context):
- if field_name != 'avg_answers':
- state = field_name[5:]
- cr.execute("select count(*) from crm_lead where section_id =%s and state='%s'"%(case.section_id.id,state))
- state_cases = cr.fetchone()[0]
- perc_state = (state_cases / float(case.nbr_cases) ) * 100
-
- res[case.id] = perc_state
- else:
- cr.execute('select count(*) from crm_case_log l where l.section_id=%s'%(case.section_id.id))
- logs = cr.fetchone()[0]
-
- avg_ans = logs / case.nbr_cases
- res[case.id] = avg_ans
-
- return res
-
- _columns = {
- 'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
- 'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
- 'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
- 'delay_close': fields.char('Delay to close', size=20, readonly=True),
- }
- _order = 'name desc, section_id'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_lead_section')
- cr.execute("""
- create or replace view report_crm_lead_section as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- count(*) as nbr_cases,
- c.section_id as section_id,
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
from
crm_lead c
- group by to_char(c.create_date, 'YYYY'),to_char(c.create_date, 'MM'),c.section_id
+ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id,c.stage_id,categ_id
)""")
-report_crm_lead_section()
-
-class report_crm_lead_section_stage(osv.osv):
- _name = "report.crm.lead.section.stage"
- _description = "Leads by section and stage"
- _auto = False
- _inherit = "report.crm.case.section.stage"
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'stage_id, section_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_lead_section_stage")
- cr.execute("""
- create view report_crm_lead_section_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.stage_id,
- c.section_id,
- c.categ_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_lead c
- where c.stage_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.categ_id, c.section_id)""")
-
-report_crm_lead_section_stage()
-
-class report_crm_lead_section_type(osv.osv):
- _name = "report.crm.lead.section.type"
- _inherit = "report.crm.case.section.type"
- _description = "Leads by section and type"
- _auto = False
- _columns = {
- 'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_lead_section_type")
- cr.execute("""
- create view report_crm_lead_section_type as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.type_id,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_lead c
- where c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.type_id, c.section_id)""")
-
-report_crm_lead_section_type()
-
-class report_crm_lead_section_categ_stage(osv.osv):
- _name = "report.crm.lead.section.categ.stage"
- _inherit = "report.crm.case.section.categ.stage"
- _description = "Leads by Section, Category and Stage"
- _auto = False
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ','Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'stage_id, categ_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_lead_section_categ_stage")
- cr.execute("""
- create view report_crm_lead_section_categ_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_lead c
- where c.categ_id is not null AND c.stage_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_lead_section_categ_stage()
-
-class report_crm_lead_section_categ_type(osv.osv):
- _name = "report.crm.lead.section.categ.type"
- _inherit = "report.crm.case.section.categ.type"
- _description = "Leads by Section, Category and Type"
- _auto = False
- _columns = {
- 'categ_id':fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.lead')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'categ_id, type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_lead_section_categ_type")
- cr.execute("""
- create view report_crm_lead_section_categ_type as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.type_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_lead c
- where c.categ_id is not null AND c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.type_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_lead_section_categ_type()
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+report_crm_lead()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_crm/report_crm_lead_view.xml b/addons/report_crm/report_crm_lead_view.xml
index 8dbec663dd2..4ce37467409 100644
--- a/addons/report_crm/report_crm_lead_view.xml
+++ b/addons/report_crm/report_crm_lead_view.xml
@@ -5,43 +5,43 @@
Leads by user and section
-->
-
- report.crm.lead.user.tree
- report.crm.lead.user
-
+
+ report.crm.lead.tree
+ report.crm.lead
tree
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
- report.crm.lead.user.form
- report.crm.lead.user
-
+
+ report.crm.lead.form
+ report.crm.lead
+
form
-
-
-
-
+
-
- report.crm.lead.user.graph
- report.crm.lead.user
+
+ report.crm.lead.graph
+ report.crm.lead
graph
-
+
@@ -49,437 +49,41 @@
-
- report.crm.lead.user.select
- report.crm.lead.user
-
+
+ report.crm.lead.select
+ report.crm.lead
+
search
-
-
+
-
-
- Leads by User and Section
- report.crm.lead.user
+
+
+
+ Leads
+ report.crm.lead
form
graph,tree
-
-
+
+
+
-
-
-
-
+
+
+
+ tree
+
+
+
+
+
+
+ graph
+
+
+
-
- report.crm.lead.categ.tree
- report.crm.lead.categ
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.lead.categ.form
- report.crm.lead.categ
-
- form
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.lead.categ.graph
- report.crm.lead.categ
- graph
-
-
-
-
-
-
-
-
-
-
- report.crm.lead.categ.select
- report.crm.lead.categ
-
- search
-
-
-
-
-
-
-
- Leads by Categories and Section
- report.crm.lead.categ
- form
- graph,tree
-
-
-
-
-
-
-
-
- report.crm.lead.section.tree
- report.crm.lead.section
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.lead.section.graph
- report.crm.lead.section
- graph
-
-
-
-
-
-
-
-
-
- report.crm.lead.section.select
- report.crm.lead.section
-
- search
-
-
-
-
-
-
-
- Leads by Section
- report.crm.lead.section
- form
- graph,tree
-
-
-
-
-
-
-
-
- Leads Report - Sections and Stage(Tree)
- report.crm.lead.section.stage
-
- tree
-
-
-
-
-
-
-
-
-
-
- Leads Report - Sections and Stage(Form)
- report.crm.lead.section.stage
- form
-
-
-
-
-
-
-
-
-
-
- Leads Report - Sections and Stage(Graph)
- report.crm.lead.section.stage
- graph
-
-
-
-
-
-
-
-
-
- Leads Report - Sections and Stage(Select)
- report.crm.lead.section.stage
- search
-
-
-
-
-
-
-
- report.crm.lead.section.stage
- form
- graph,tree
-
-
-
-
- #
- # Leads by section and type
- #
-
-
- CRM Report - Sections and Type(Tree)
- report.crm.lead.section.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Form)
- report.crm.lead.section.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Graph)
- report.crm.lead.section.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Select)
- report.crm.lead.section.type
-
- search
-
-
-
-
-
-
-
-
- report.crm.lead.section.type
- Leads by section and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Leads by section, category and stage
- #
-
-
- CRM Report - Section, Category and Stage(Tree)
- report.crm.lead.section.categ.stage
-
- tree
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Form)
- report.crm.lead.section.categ.stage
-
- form
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.lead.section.categ.stage
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.lead.section.categ.stage
-
- search
-
-
-
-
-
-
-
-
-
- report.crm.lead.section.categ.stage
- Leads by section, category and stage
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Leads by section, category and type
- #
-
-
- CRM Report - Section, Category and Type(Tree)
- report.crm.lead.section.categ.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Form)
- report.crm.lead.section.categ.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.lead.section.categ.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.lead.section.categ.type
-
- search
-
-
-
-
-
-
-
-
-
-
- report.crm.lead.section.categ.type
- Leads by section, category and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
+
diff --git a/addons/report_crm/report_crm_opportunity.py b/addons/report_crm/report_crm_opportunity.py
index 6671d72fd8b..1adfbf4baed 100644
--- a/addons/report_crm/report_crm_opportunity.py
+++ b/addons/report_crm/report_crm_opportunity.py
@@ -1,21 +1,23 @@
from osv import fields,osv
import tools
-class report_crm_opportunity_user(osv.osv):
- _name = "report.crm.opportunity.user"
- _description = "Opportunity by user and section"
+class report_crm_opportunity(osv.osv):
+ _name = "report.crm.opportunity"
_auto = False
- _inherit = "report.crm.case.user"
+ _inherit = "report.crm.case"
+
_columns = {
'probability': fields.float('Avg. Probability', readonly=True),
'amount_revenue': fields.float('Est.Revenue', readonly=True),
'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
'delay_close': fields.char('Delay to close', size=20, readonly=True),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]"),
+ 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
}
def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_opportunity_user')
+ tools.drop_view_if_exists(cr, 'report_crm_opportunity')
cr.execute("""
- create or replace view report_crm_opportunity_user as (
+ create or replace view report_crm_opportunity as (
select
min(c.id) as id,
to_char(c.create_date, 'YYYY') as name,
@@ -23,210 +25,19 @@ class report_crm_opportunity_user(osv.osv):
c.state,
c.user_id,
c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_opportunity c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id
- )""")
-report_crm_opportunity_user()
-
-class report_crm_opportunity_categ(osv.osv):
- _name = "report.crm.opportunity.categ"
- _description = "Opportunity by section and category"
- _auto = False
- _inherit = "report.crm.case.categ"
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]"),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
- 'probability': fields.float('Avg. Probability', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
-
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_opportunity_categ')
- cr.execute("""
- create or replace view report_crm_opportunity_categ as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
c.categ_id,
- c.state,
- c.section_id,
+ c.stage_id,
count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
- avg(probability)::decimal(16,2) as probability,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_opportunity c
- group by c.categ_id,to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state,c.section_id
- )""")
-report_crm_opportunity_categ()
-
-class report_crm_opportunity_section(osv.osv):
- _name = "report.crm.opportunity.section"
- _description = "Opportunity by Section"
- _auto = False
- _inherit = "report.crm.case.section"
-
- def _get_data(self, cr, uid, ids, field_name, arg, context={}):
- res = {}
- state_perc = 0.0
- avg_ans = 0.0
-
- for case in self.browse(cr, uid, ids, context):
- if field_name != 'avg_answers':
- state = field_name[5:]
- cr.execute("select count(*) from crm_opportunity where section_id =%s and state='%s'"%(case.section_id.id,state))
- state_cases = cr.fetchone()[0]
- perc_state = (state_cases / float(case.nbr_cases) ) * 100
-
- res[case.id] = perc_state
- else:
- cr.execute('select count(*) from crm_case_log l where l.section_id=%s'%(case.section_id.id))
- logs = cr.fetchone()[0]
-
- avg_ans = logs / case.nbr_cases
- res[case.id] = avg_ans
-
- return res
-
- _columns = {
- 'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
- 'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
- 'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
- 'delay_close': fields.char('Delay to close', size=20, readonly=True),
- }
- _order = 'name desc, section_id'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_opportunity_section')
- cr.execute("""
- create or replace view report_crm_opportunity_section as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- count(*) as nbr_cases,
- c.section_id as section_id,
0 as avg_answers,
0.0 as perc_done,
0.0 as perc_cancel,
+ sum(planned_revenue) as amount_revenue,
+ sum(planned_revenue*probability)::decimal(16,2) as amount_revenue_prob,
+ avg(probability)::decimal(16,2) as probability,
to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
from
crm_opportunity c
- group by to_char(c.create_date, 'YYYY'),to_char(c.create_date, 'MM'),c.section_id
+ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id,c.stage_id,c.categ_id
)""")
-report_crm_opportunity_section()
-
-class report_crm_opportunity_section_type(osv.osv):
- _name = "report.crm.opportunity.section.type"
- _inherit = "report.crm.case.section.type"
- _description = "Opportunity by section and type"
- _auto = False
- _columns = {
- 'type_id': fields.many2one('crm.case.resource.type', 'Opportunity Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'amount_revenue': fields.float('Est.Revenue', readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_opportunity_section_type")
- cr.execute("""
- create view report_crm_opportunity_section_type as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.state,
- c.type_id,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- sum(planned_revenue) as amount_revenue,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_opportunity c
- where c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.user_id, c.state, c.stage_id, c.type_id, c.section_id)""")
-
-report_crm_opportunity_section_type()
-
-class report_crm_opportunity_section_categ_stage(osv.osv):
- _name = "report.crm.opportunity.section.categ.stage"
- _inherit = "report.crm.case.section.categ.stage"
- _description = "Opportunity by Section, Category and Stage"
- _auto = False
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ','Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'stage_id, categ_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_opportunity_section_categ_stage")
- cr.execute("""
- create view report_crm_opportunity_section_categ_stage as (
- select
- min(c.id) as id,
- to_char(c.create_date,'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_opportunity c
- where c.categ_id is not null AND c.stage_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_opportunity_section_categ_stage()
-
-class report_crm_opportunity_section_categ_type(osv.osv):
- _name = "report.crm.opportunity.section.categ.type"
- _inherit = "report.crm.case.section.categ.type"
- _description = "Opportunity by Section, Category and Type"
- _auto = False
- _columns = {
- 'categ_id':fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'type_id': fields.many2one('crm.case.resource.type', 'Opportunity Type', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'stage_id':fields.many2one('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]", readonly=True),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
- _order = 'categ_id, type_id'
-
- def init(self, cr):
- tools.sql.drop_view_if_exists(cr, "report_crm_opportunity_section_categ_type")
- cr.execute("""
- create view report_crm_opportunity_section_categ_type as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- c.user_id,
- c.categ_id,
- c.type_id,
- c.state,
- c.stage_id,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_opportunity c
- where c.categ_id is not null AND c.type_id is not null
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'),c.user_id, c.categ_id, c.type_id, c.state, c.stage_id, c.section_id)""")
-
-report_crm_opportunity_section_categ_type()
+report_crm_opportunity()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_crm/report_crm_opportunity_view.xml b/addons/report_crm/report_crm_opportunity_view.xml
index 17310cfd0aa..9b2712ef57b 100644
--- a/addons/report_crm/report_crm_opportunity_view.xml
+++ b/addons/report_crm/report_crm_opportunity_view.xml
@@ -5,25 +5,31 @@
Opportunities by user and section
-->
-
- report.crm.opportunity.user.tree
- report.crm.opportunity.user
-
+
+ report.crm.opportunity.tree
+ report.crm.opportunity
tree
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
-
- report.crm.opportunity.user.form
- report.crm.opportunity.user
-
+
+ report.crm.opportunity.form
+ report.crm.opportunity
+
form
@@ -36,12 +42,12 @@
-
- report.crm.opportunity.user.graph
- report.crm.opportunity.user
+
+ report.crm.opportunity.graph
+ report.crm.opportunity
graph
-
+
@@ -49,378 +55,38 @@
-
- report.crm.opportunity.user.select
- report.crm.opportunity.user
-
+
+ report.crm.opportunity.select
+ report.crm.opportunity
+
search
-
+
-
- Opportunity by User and Section
- report.crm.opportunity.user
+
+ Opportunities
+ report.crm.opportunity
form
graph,tree
-
-
+
+
-
-
-
-
+
+
+ tree
+
+
+
+
+
+ graph
+
+
+
-
- report.crm.opportunity.categ.tree
- report.crm.opportunity.categ
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.categ.form
- report.crm.opportunity.categ
-
- form
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.categ.graph
- report.crm.opportunity.categ
- graph
-
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.categ.select
- report.crm.opportunity.categ
-
- search
-
-
-
-
-
-
-
- Opportunity by Categories and Section
- report.crm.opportunity.categ
- form
- graph,tree
-
-
-
-
-
-
-
-
- report.crm.opportunity.section.tree
- report.crm.opportunity.section
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.section.graph
- report.crm.opportunity.section
- graph
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.section.select
- report.crm.opportunity.section
-
- search
-
-
-
-
-
-
-
- Opportunity by Section
- report.crm.opportunity.section
- form
- graph,tree
-
-
-
-
-
- #
- # Opportunity by section and type
- #
-
-
- CRM Report - Sections and Type(Tree)
- report.crm.opportunity.section.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Form)
- report.crm.opportunity.section.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Graph)
- report.crm.opportunity.section.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Select)
- report.crm.opportunity.section.type
-
- search
-
-
-
-
-
-
-
-
- report.crm.opportunity.section.type
- Opportunity by section and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # Opportunity by section, category and stage
- #
-
-
- CRM Report - Section, Category and Stage(Tree)
- report.crm.opportunity.section.categ.stage
-
- tree
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Form)
- report.crm.opportunity.section.categ.stage
-
- form
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.opportunity.section.categ.stage
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.opportunity.section.categ.stage
-
- search
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.section.categ.stage
- Opportunity by section, category and stage
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
-
- #
- # opportunitys by section, category and type
- #
-
-
- CRM Report - Section, Category and Type(Tree)
- report.crm.opportunity.section.categ.type
-
- tree
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Form)
- report.crm.opportunity.section.categ.type
-
- form
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.opportunity.section.categ.type
- graph
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.opportunity.section.categ.type
-
- search
-
-
-
-
-
-
-
-
-
-
- report.crm.opportunity.section.categ.type
- Opportunity by section, category and type
- form
- graph,tree
-
-
-
-
- graph
-
-
-
-
-
- tree
-
-
-
-
+
diff --git a/addons/report_crm/report_crm_phonecall.py b/addons/report_crm/report_crm_phonecall.py
index 5af580ba18c..e693179a258 100644
--- a/addons/report_crm/report_crm_phonecall.py
+++ b/addons/report_crm/report_crm_phonecall.py
@@ -1,18 +1,19 @@
from osv import fields,osv
import tools
-class report_crm_phonecall_user(osv.osv):
- _name = "report.crm.phonecall.user"
+class report_crm_phonecall(osv.osv):
+ _name = "report.crm.phonecall"
_description = "Phone calls by user and section"
_auto = False
- _inherit = "report.crm.case.user"
+ _inherit = "report.crm.case"
_columns = {
'delay_close': fields.char('Delay to close', size=20, readonly=True),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.phonecall')]"),
}
def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_phonecall_user')
+ tools.drop_view_if_exists(cr, 'report_crm_phonecall')
cr.execute("""
- create or replace view report_crm_phonecall_user as (
+ create or replace view report_crm_phonecall as (
select
min(c.id) as id,
to_char(c.create_date, 'YYYY') as name,
@@ -20,96 +21,15 @@ class report_crm_phonecall_user(osv.osv):
c.state,
c.user_id,
c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_phonecall c
- group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id
- )""")
-report_crm_phonecall_user()
-
-class report_crm_phonecall_categ(osv.osv):
- _name = "report.crm.phonecall.categ"
- _description = "Phone calls by section and category"
- _auto = False
- _inherit = "report.crm.case.categ"
- _columns = {
- 'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.phonecall')]"),
- 'delay_close': fields.char('Delay Close', size=20, readonly=True),
- }
-
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_phonecall_categ')
- cr.execute("""
- create or replace view report_crm_phonecall_categ as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
c.categ_id,
- c.state,
- c.section_id,
- count(*) as nbr,
- to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
- from
- crm_phonecall c
- group by c.categ_id,to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state,c.section_id
- )""")
-report_crm_phonecall_categ()
-
-class report_crm_phonecall_section(osv.osv):
- _name = "report.crm.phonecall.section"
- _description = "Phone calls by Section"
- _auto = False
- _inherit = "report.crm.case.section"
-
- def _get_data(self, cr, uid, ids, field_name, arg, context={}):
- res = {}
- state_perc = 0.0
- avg_ans = 0.0
-
- for case in self.browse(cr, uid, ids, context):
- if field_name != 'avg_answers':
- state = field_name[5:]
- cr.execute("select count(*) from crm_phonecall where section_id =%s and state='%s'"%(case.section_id.id,state))
- state_cases = cr.fetchone()[0]
- perc_state = (state_cases / float(case.nbr_cases) ) * 100
-
- res[case.id] = perc_state
- else:
- cr.execute('select count(*) from crm_case_log l where l.section_id=%s'%(case.section_id.id))
- logs = cr.fetchone()[0]
-
- avg_ans = logs / case.nbr_cases
- res[case.id] = avg_ans
-
- return res
-
- _columns = {
- 'avg_answers': fields.function(_get_data,string='Avg. Answers', method=True,type="integer"),
- 'perc_done': fields.function(_get_data,string='%Done', method=True,type="float"),
- 'perc_cancel': fields.function(_get_data,string='%Cancel', method=True,type="float"),
- 'delay_close': fields.char('Delay to close', size=20, readonly=True),
- }
- _order = 'name desc, section_id'
- def init(self, cr):
- tools.drop_view_if_exists(cr, 'report_crm_phonecall_section')
- cr.execute("""
- create or replace view report_crm_phonecall_section as (
- select
- min(c.id) as id,
- to_char(c.create_date, 'YYYY') as name,
- to_char(c.create_date, 'MM') as month,
- count(*) as nbr_cases,
- c.section_id as section_id,
+ count(*) as nbr,
0 as avg_answers,
0.0 as perc_done,
- 0.0 as perc_cancel,
+ 0.0 as perc_cancel,
to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close
from
crm_phonecall c
- group by to_char(c.create_date, 'YYYY'),to_char(c.create_date, 'MM'),c.section_id
+ group by to_char(c.create_date, 'YYYY'), to_char(c.create_date, 'MM'), c.state, c.user_id,c.section_id, c.categ_id
)""")
-report_crm_phonecall_section()
-
+report_crm_phonecall()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_crm/report_crm_phonecall_view.xml b/addons/report_crm/report_crm_phonecall_view.xml
index c45a6936bab..27f9ceda835 100644
--- a/addons/report_crm/report_crm_phonecall_view.xml
+++ b/addons/report_crm/report_crm_phonecall_view.xml
@@ -5,24 +5,27 @@
Phone calls by user and section
-->
-
- report.crm.phonecall.user.tree
- report.crm.phonecall.user
-
+
+ report.crm.phonecall.tree
+ report.crm.phonecall
tree
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
- report.crm.phonecall.user.form
- report.crm.phonecall.user
-
+
+ report.crm.phonecall.form
+ report.crm.phonecall
+
form
@@ -34,9 +37,9 @@
-
- report.crm.phonecall.user.graph
- report.crm.phonecall.user
+
+ report.crm.phonecall.graph
+ report.crm.phonecall
graph
@@ -45,143 +48,43 @@
-
+
-
- report.crm.phonecall.user.select
- report.crm.phonecall.user
-
+
+ report.crm.phonecall.select
+ report.crm.phonecall
+
search
-
+
-
+
-
- Phone calls by User and Section
- report.crm.phonecall.user
+
+ Phone Calls
+ report.crm.phonecall
form
graph,tree
-
-
+
+
-
-
-
-
+
+
+
+ tree
+
+
+
-
- report.crm.phonecall.categ.tree
- report.crm.phonecall.categ
-
- tree
-
-
-
-
-
-
-
-
-
-
- report.crm.phonecall.categ.form
- report.crm.phonecall.categ
-
- form
-
-
-
-
-
-
-
-
-
-
-
- report.crm.phonecall.categ.graph
- report.crm.phonecall.categ
- graph
-
-
-
-
-
-
-
-
-
-
- report.crm.phonecall.categ.select
- report.crm.phonecall.categ
-
- search
-
-
-
-
-
-
-
- Phone calls by Categories and Section
- report.crm.phonecall.categ
- form
- graph,tree
-
-
-
-
-
-
-
-
- report.crm.phonecall.section.tree
- report.crm.phonecall.section
-
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.phonecall.section.graph
- report.crm.phonecall.section
- graph
-
-
-
-
-
-
-
-
-
- report.crm.phonecall.section.select
- report.crm.phonecall.section
-
- search
-
-
-
-
-
-
-
- Phone calls by Section
- report.crm.phonecall.section
- form
- graph,tree
-
-
-
-
+
+
+ graph
+
+
+
+
+
+
diff --git a/addons/report_crm/report_crm_view.xml b/addons/report_crm/report_crm_view.xml
index 7b46928cb6b..61fe7766ddf 100644
--- a/addons/report_crm/report_crm_view.xml
+++ b/addons/report_crm/report_crm_view.xml
@@ -1,17 +1,13 @@
-
+
-
-
-
- report.crm.case.user.tree
- report.crm.case.user
+
+ report.crm.case.tree
+ report.crm.case
tree
-
+
@@ -21,12 +17,12 @@
-
- report.crm.case.user.form
- report.crm.case.user
+
+ report.crm.case.form
+ report.crm.case
form
-
-
- report.crm.case.user.graph
- report.crm.case.user
+
+ report.crm.case.graph
+ report.crm.case
graph
@@ -50,402 +46,71 @@
-
- report.crm.case.user.select
- report.crm.case.user
+
+ report.crm.case.select
+ report.crm.case
search
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
- Cases by User and Section
- report.crm.case.user
+
+ Cases
+ report.crm.case
form
tree,graph
-
+
-
-
-
- report.crm.case.categ.tree
- report.crm.case.categ
- tree
-
-
-
-
-
-
-
-
-
-
-
- report.crm.case.categ.form
- report.crm.case.categ
- form
-
-
-
-
-
-
- report.crm.case.categ.select
- report.crm.case.categ
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Cases by Categories and Section
- report.crm.case.categ
- form
- tree,graph
-
-
-
+
-
+
-
+
+
-
-
-
- report.crm.case.section.tree
- report.crm.case.section
- tree
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.case.section.graph
- report.crm.case.section
- graph
-
-
-
-
-
-
-
-
-
- report.crm.case.section.select
- report.crm.case.section
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Cases by Section
- report.crm.case.section
- form
- graph,tree
-
-
-
- #
- # Cases by section and stage
- #
-
- CRM Report - Sections and Stage(Tree)
- report.crm.case.section.stage
- tree
-
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Stage(Form)
- report.crm.case.section.stage
- form
-
-
-
-
-
-
- CRM Report - Sections and Stage(Select)
- report.crm.case.section.stage
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.case.section.stage
- form
- tree
-
-
-
- #
- # Cases by section and type of case
- #
-
-
- CRM Report - Sections and Type(Tree)
- report.crm.case.section.type
- tree
-
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Sections and Type(Form)
- report.crm.case.section.type
- form
-
-
-
-
-
-
- CRM Report - Sections and Type(Select)
- report.crm.case.section.type
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.case.section.type
- form
- tree
-
-
-
- #
- # Cases by section, category and stage
- #
-
-
- CRM Report - Section, Category and Stage(Tree)
- report.crm.case.section.categ.stage
- tree
-
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Form)
- report.crm.case.section.categ.stage
- form
-
-
-
-
-
-
- CRM Report - Section, Category and Stage(Select)
- report.crm.case.section.categ.stage
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.case.section.categ.stage
- form
- tree
-
-
-
- #
- # Cases by section, category and type
- #
-
-
- CRM Report - Section, Category and Type(Tree)
- report.crm.case.section.categ.type
- tree
-
-
-
-
-
-
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Form)
- report.crm.case.section.categ.type
- form
-
-
-
-
-
-
- CRM Report - Section, Category and Type(Select)
- report.crm.case.section.categ.type
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- report.crm.case.section.categ.type
- form
- tree
-
-
diff --git a/addons/resource/__terp__.py b/addons/resource/__terp__.py
index 4970fe2ceac..7c924574cf1 100755
--- a/addons/resource/__terp__.py
+++ b/addons/resource/__terp__.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL ().
#
@@ -15,7 +15,7 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
+# along with this program. If not, see .
#
##############################################################################
@@ -29,7 +29,7 @@
"description": """
Module for resource management. You can manage:
* Leave/Holidays or Days off of the company
-
+
""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
@@ -37,11 +37,11 @@
'init_xml': [],
'update_xml': [
#'security/resource_security.xml',
-# 'security/ir.model.access.csv',
- 'resource_view.xml',
+# 'security/ir.model.access.csv',
+ 'resource_view.xml',
+ ],
+ 'demo_xml': ['resource_demo.xml'
],
- 'demo_xml': [#'resource_demo.xml'
- ],
'installable': True,
'active': False,
'certificate': None,
diff --git a/addons/resource/resource.py b/addons/resource/resource.py
index d38bb40af5d..09a752850c9 100755
--- a/addons/resource/resource.py
+++ b/addons/resource/resource.py
@@ -37,16 +37,16 @@ class resource_calendar(osv.osv):
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'resource.calendar', c)
}
- def interval_min_get(self, cr, uid, id, dt_from, hours,resource=False):
+ def interval_min_get(self, cr, uid, id, dt_from, hours, resource=False):
resource_cal_leaves = self.pool.get('resource.calendar.leaves')
dt_leave = []
if not id:
- return [(dt_from-mx.DateTime.RelativeDateTime(hours=int(hours)*3), dt_from)]
- resource_leave_ids = resource_cal_leaves.search(cr,uid,[('calendar_id','=',id),'|',('resource_id','=',False),('resource_id','=',resource)])
- res_leaves = resource_cal_leaves.read(cr,uid,resource_leave_ids,['date_from','date_to'])
+ return [(dt_from - mx.DateTime.RelativeDateTime(hours=int(hours)*3), dt_from)]
+ resource_leave_ids = resource_cal_leaves.search(cr, uid, [('calendar_id','=',id), '|', ('resource_id','=',False), ('resource_id','=',resource)])
+ res_leaves = resource_cal_leaves.read(cr, uid, resource_leave_ids, ['date_from', 'date_to'])
for leave in res_leaves:
- dtf = mx.DateTime.strptime(leave['date_from'],'%Y-%m-%d %H:%M:%S')
- dtt = mx.DateTime.strptime(leave['date_to'],'%Y-%m-%d %H:%M:%S')
+ dtf = mx.DateTime.strptime(leave['date_from'], '%Y-%m-%d %H:%M:%S')
+ dtt = mx.DateTime.strptime(leave['date_to'], '%Y-%m-%d %H:%M:%S')
no = dtt - dtf
[dt_leave.append((dtf + mx.DateTime.RelativeDateTime(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))]
dt_leave.sort()
@@ -72,8 +72,8 @@ class resource_calendar(osv.osv):
if leave_flag:
break
else:
- d1 = mx.DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(hour_from)),int((hour_from%1) * 60))
- d2 = mx.DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(m)),int((m%1) * 60))
+ d1 = mx.DateTime.DateTime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(hour_from)), int((hour_from%1) * 60))
+ d2 = mx.DateTime.DateTime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(m)), int((m%1) * 60))
result.append((d1, d2))
current_hour = hour_from
todo -= (m-hour_from)
@@ -87,16 +87,15 @@ class resource_calendar(osv.osv):
resource_cal_leaves = self.pool.get('resource.calendar.leaves')
dt_leave = []
if not id:
- return [(dt_from,dt_from+mx.DateTime.RelativeDateTime(hours=int(hours)*3))]
- resource_leave_ids = resource_cal_leaves.search(cr,uid,[('calendar_id','=',id),'|',('resource_id','=',False),('resource_id','=',resource)])
- res_leaves = resource_cal_leaves.read(cr,uid,resource_leave_ids,['date_from','date_to'])
+ return [(dt_from,dt_from + mx.DateTime.RelativeDateTime(hours=int(hours)*3))]
+ resource_leave_ids = resource_cal_leaves.search(cr, uid, [('calendar_id','=',id), '|', ('resource_id','=',False), ('resource_id','=',resource)])
+ res_leaves = resource_cal_leaves.read(cr, uid, resource_leave_ids, ['date_from', 'date_to'])
for leave in res_leaves:
- dtf = mx.DateTime.strptime(leave['date_from'],'%Y-%m-%d %H:%M:%S')
- dtt = mx.DateTime.strptime(leave['date_to'],'%Y-%m-%d %H:%M:%S')
+ dtf = mx.DateTime.strptime(leave['date_from'], '%Y-%m-%d %H:%M:%S')
+ dtt = mx.DateTime.strptime(leave['date_to'], '%Y-%m-%d %H:%M:%S')
no = dtt - dtf
[dt_leave.append((dtf + mx.DateTime.RelativeDateTime(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))]
dt_leave.sort()
- print 'dtLevae',dt_leave
todo = hours
cycle = 0
result = []
@@ -113,13 +112,13 @@ class resource_calendar(osv.osv):
dt_check = dt_from.strftime('%Y-%m-%d')
for leave in dt_leave:
if dt_check == leave:
- dt_check = mx.DateTime.strptime(dt_check,"%Y-%m-%d") + mx.DateTime.RelativeDateTime(days=1)
+ dt_check = mx.DateTime.strptime(dt_check, "%Y-%m-%d") + mx.DateTime.RelativeDateTime(days=1)
leave_flag = True
if leave_flag:
break
else:
- d1 = mx.DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(m)),int((m%1) * 60))
- d2 = mx.DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(hour_to)),int((hour_to%1) * 60))
+ d1 = mx.DateTime.DateTime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(m)), int((m%1) * 60))
+ d2 = mx.DateTime.DateTime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(hour_to)), int((hour_to%1) * 60))
result.append((d1, d2))
current_hour = hour_to
todo -= (hour_to - m)
@@ -170,11 +169,11 @@ class resource_resource(osv.osv):
if context.get('project_id',False):
project_pool = self.pool.get('project.project')
- project_rec = project_pool.browse(cr,uid,context['project_id'])
+ project_rec = project_pool.browse(cr, uid, context['project_id'])
user_ids = [user_id.id for user_id in project_rec.members]
args.append(('user_id','in',user_ids))
- return super(resource_resource, self).search(cr, uid, args, offset, limit,order, context, count)
+ return super(resource_resource, self).search(cr, uid, args, offset, limit, order, context, count)
resource_resource()
class resource_calendar_leaves(osv.osv):
@@ -189,7 +188,7 @@ class resource_calendar_leaves(osv.osv):
'resource_id' : fields.many2one("resource.resource", "Resource", help="If empty, this is a generic holiday for the company. If a resource is set, the holiday/leave is only for this resource"),
}
def check_dates(self, cr, uid, ids):
- leave = self.read(cr, uid, ids[0],['date_from','date_to'])
+ leave = self.read(cr, uid, ids[0], ['date_from', 'date_to'])
if leave['date_from'] and leave['date_to']:
if leave['date_from'] > leave['date_to']:
return False
@@ -203,9 +202,9 @@ class resource_calendar_leaves(osv.osv):
result = {}
if resource:
resource_pool = self.pool.get('resource.resource')
- result['calendar_id'] = resource_pool.browse(cr,uid,resource).calendar_id.id
- return {'value':result}
- return {'value':{'calendar_id':[]}}
+ result['calendar_id'] = resource_pool.browse(cr, uid, resource).calendar_id.id
+ return {'value': result}
+ return {'value': {'calendar_id': []}}
resource_calendar_leaves()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/resource/resource_demo.xml b/addons/resource/resource_demo.xml
new file mode 100644
index 00000000000..b70728ea9ad
--- /dev/null
+++ b/addons/resource/resource_demo.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+ 38 Hours/Week
+
+
+
+ Monday morning
+ 0
+ 08
+ 12
+
+
+
+ Monday evening
+ 0
+ 13
+ 18
+
+
+
+ Tuesday morning
+ 1
+ 08
+ 12
+
+
+
+ Tuesday evening
+ 1
+ 13
+ 18
+
+
+
+ Wednesday morning
+ 2
+ 08
+ 12
+
+
+
+ Wednesday evening
+ 2
+ 13
+ 18
+
+
+
+ Thursday morning
+ 3
+ 08
+ 12
+
+
+
+ Thursday evening
+ 13
+ 18
+ 3
+
+
+
+ Friday morning
+ 4
+ 08
+ 12
+
+
+
+ Friday evening
+ 4
+ 13
+ 18
+
+
+
+
+
diff --git a/addons/resource/resource_view.xml b/addons/resource/resource_view.xml
index bce5d2f8807..36f15124b9d 100755
--- a/addons/resource/resource_view.xml
+++ b/addons/resource/resource_view.xml
@@ -120,8 +120,7 @@
tree,form
-
-
+
resource.calendar.leaves.form
@@ -161,17 +160,5 @@
-
-
- project.member.tree
- resource.resource
- tree
-
-
-
-
-
-
-
diff --git a/addons/sale/report_sale_view.xml b/addons/sale/report_sale_view.xml
index 28749e8b672..286a529cf82 100644
--- a/addons/sale/report_sale_view.xml
+++ b/addons/sale/report_sale_view.xml
@@ -85,13 +85,5 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 563739c53ae..e48d59d1f4a 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -408,6 +408,25 @@
+
+ sale.order.uninvoiced.line
+ sale.order.line
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
Uninvoiced Lines
ir.actions.act_window
@@ -415,6 +434,7 @@
form
tree,form,graph
[('invoiced','<>', 1),('state','<>','draft'),('state','<>','cancel')]
+
diff --git a/addons/scrum/scrum_view.xml b/addons/scrum/scrum_view.xml
index ca762af4955..9706103127f 100644
--- a/addons/scrum/scrum_view.xml
+++ b/addons/scrum/scrum_view.xml
@@ -78,7 +78,7 @@
-
+
@@ -103,7 +103,7 @@
@@ -184,17 +184,17 @@
-
+
-
+
-
+
@@ -456,7 +456,7 @@
-
+
diff --git a/addons/scrum/wizard/backlog_to_task.py b/addons/scrum/wizard/backlog_to_task.py
index 295ec6c1d5f..65795906765 100644
--- a/addons/scrum/wizard/backlog_to_task.py
+++ b/addons/scrum/wizard/backlog_to_task.py
@@ -48,7 +48,7 @@ def _do_create(self, cr, uid, data, context):
'name': backlog.name,
'description': backlog.note,
'project_id': backlog.project_id.id,
- 'user_id': (backlog.user_id and backlog.user_id.id) or uid,
+ 'user_id': data['form']['user_id'] or (backlog.user_id and backlog.user_id.id) or uid,
'planned_hours': backlog.planned_hours
}))
diff --git a/addons/survey/survey.py b/addons/survey/survey.py
index a3772f55f92..ccd3e3d28f4 100644
--- a/addons/survey/survey.py
+++ b/addons/survey/survey.py
@@ -1579,7 +1579,7 @@ class survey_request(osv.osv):
'user_id' : fields.many2one("res.users", "User"),
'email' : fields.char("E-mail", size=64),
'survey_id' : fields.many2one("survey", "Survey", required=1),
- 'answer_ids' : fields.one2many('survey.answer', 'question_id', 'Answer'),
+ 'response' : fields.many2one('survey.response', 'Answer'),
'state' : fields.selection([('waiting_answer', 'Wating Answer'),('done', 'Done'),('cancel', 'Cancelled')], 'State', readonly=1)
}
_defaults = {
diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml
index af1c46cfcdf..fc484af927e 100644
--- a/addons/survey/survey_view.xml
+++ b/addons/survey/survey_view.xml
@@ -1022,7 +1022,7 @@
-
+