diff --git a/addons/crm/crm_opportunity.py b/addons/crm/crm_opportunity.py
index ea70e850ed8..d2fff629c5a 100644
--- a/addons/crm/crm_opportunity.py
+++ b/addons/crm/crm_opportunity.py
@@ -19,6 +19,7 @@
#
##############################################################################
+from datetime import datetime
from osv import fields,osv,orm
import crm
@@ -35,6 +36,39 @@ class crm_opportunity(osv.osv):
_description = "Opportunity Cases"
_order = "id desc"
_inherit = 'crm.case'
+
+ def _compute_openday(self, cr, uid, ids, name, args, context={}):
+ result = {}
+ for r in self.browse(cr, uid, ids , context):
+ result[r.id] = 0
+ model_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'crm.opportunity')])
+ log_obj = self.pool.get('crm.case.log')
+ hist_id = log_obj.search(cr, uid, [('model_id', '=', model_id[0]), \
+ ('res_id', '=', r.id), \
+ ('name', '=', 'Open')])
+
+ if hist_id:
+ # Considering last log for opening case
+ log = log_obj.browse(cr, uid, hist_id[-1])
+ date_lead_open = datetime.strptime(r.create_date, "%Y-%m-%d %H:%M:%S")
+ date_log_open = datetime.strptime(log.date, "%Y-%m-%d %H:%M:%S")
+ ans = date_lead_open - date_log_open
+ duration = float(ans.days) + (float(ans.seconds) / 86400)
+ result[r.id] = abs(int(duration))
+ return result
+
+ def _compute_closeday(self, cr, uid, ids, name, args, context={}):
+ result = {}
+ for r in self.browse(cr, uid, ids , context):
+ result[r.id] = 0
+ if r.date_closed:
+ date_create = datetime.strptime(r.create_date, "%Y-%m-%d %H:%M:%S")
+ date_close = datetime.strptime(r.date_closed, "%Y-%m-%d %H:%M:%S")
+ ans = date_close - date_create
+ duration = float(ans.days) + (float(ans.seconds) / 86400)
+ result[r.id] = abs(int(duration))
+ return result
+
_columns = {
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]"),
'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]"),
@@ -52,7 +86,13 @@ class crm_opportunity(osv.osv):
\nIf the case is in progress the state is set to \'Open\'.\
\nWhen the case is over, the state is set to \'Done\'.\
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
- }
+
+ 'day_open': fields.function(_compute_openday, string='Days to Open', \
+ method=True, type="integer", store=True),
+ 'day_close': fields.function(_compute_closeday, string='Days to Close', \
+ method=True, type="integer", store=True),
+ }
+
def onchange_stage_id(self, cr, uid, ids, stage_id, context={}):
if not stage_id:
return {'value':{}}
@@ -64,16 +104,16 @@ class crm_opportunity(osv.osv):
def stage_next(self, cr, uid, ids, context={}):
res = super(crm_opportunity, self).stage_next(cr, uid, ids, context=context)
for case in self.browse(cr, uid, ids, context):
- if case.stage_id and case.stage_id.on_change:
+ if case.stage_id and case.stage_id.on_change:
self.write(cr, uid, [case.id], {'probability': case.stage_id.probability})
return res
def stage_previous(self, cr, uid, ids, context={}):
res = super(crm_opportunity, self).stage_previous(cr, uid, ids, context=context)
for case in self.browse(cr, uid, ids, context):
- if case.stage_id and case.stage_id.on_change:
+ if case.stage_id and case.stage_id.on_change:
self.write(cr, uid, [case.id], {'probability': case.stage_id.probability})
- return res
+ return res
_defaults = {
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.opportunity', context=c),
diff --git a/addons/crm/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml
index d05de45790e..f1faf00ad5d 100644
--- a/addons/crm/crm_opportunity_view.xml
+++ b/addons/crm/crm_opportunity_view.xml
@@ -117,6 +117,8 @@
+
+
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index f0441c0263c..cfb6961d112 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -29,8 +29,10 @@ from tools.translate import _
import tools
from osv import fields,osv,orm
from osv.orm import except_orm
+from datetime import datetime, timedelta
from crm import crm
+import time
class project_issue(osv.osv):
@@ -38,6 +40,39 @@ class project_issue(osv.osv):
_description = "Project Issue"
_order = "priority, id desc"
_inherit = 'crm.case'
+
+ def _compute_openday(self, cr, uid, ids, name, args, context={}):
+ result = {}
+ for r in self.browse(cr, uid, ids , context):
+ result[r.id] = 0
+ model_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'project.issue')])
+ log_obj = self.pool.get('crm.case.log')
+ hist_id = log_obj.search(cr, uid, [('model_id', '=', model_id[0]), \
+ ('res_id', '=', r.id), \
+ ('name', '=', 'Open')])
+
+ if hist_id:
+ # Considering last log for opening case
+ log = log_obj.browse(cr, uid, hist_id[-1])
+ date_lead_open = datetime.strptime(r.create_date, "%Y-%m-%d %H:%M:%S")
+ date_log_open = datetime.strptime(log.date, "%Y-%m-%d %H:%M:%S")
+ ans = date_lead_open - date_log_open
+ duration = float(ans.days) + (float(ans.seconds) / 86400)
+ result[r.id] = abs(int(duration))
+ return result
+
+ def _compute_closeday(self, cr, uid, ids, name, args, context={}):
+ result = {}
+ for r in self.browse(cr, uid, ids , context):
+ result[r.id] = 0
+ if r.date_closed:
+ date_create = datetime.strptime(r.create_date, "%Y-%m-%d %H:%M:%S")
+ date_close = datetime.strptime(r.date_closed, "%Y-%m-%d %H:%M:%S")
+ ans = date_close - date_create
+ duration = float(ans.days) + (float(ans.seconds) / 86400)
+ result[r.id] = abs(int(duration))
+ return result
+
_columns = {
'date_closed': fields.datetime('Closed', readonly=True),
'date': fields.datetime('Date'),
@@ -59,27 +94,31 @@ class project_issue(osv.osv):
'partner_phone': fields.char('Phone', size=32),
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('object_id.model', '=', 'project.issue')]"),
'project_id':fields.many2one('project.project', 'Project'),
- 'duration': fields.float('Duration'),
+ 'duration': fields.float('Duration'),
'probability': fields.float('Probability (%)'),
- 'task_id': fields.many2one('project.task', 'Task', domain="[('project_id','=',project_id)]")
+ 'task_id': fields.many2one('project.task', 'Task', domain="[('project_id','=',project_id)]"),
+ 'day_open': fields.function(_compute_openday, string='Days to Open', \
+ method=True, type="integer", store=True),
+ 'day_close': fields.function(_compute_closeday, string='Days to Close', \
+ method=True, type="integer", store=True),
}
def _get_project(self, cr, uid, context):
user = self.pool.get('res.users').browse(cr,uid,uid, context=context)
if user.context_project_id:
return user.context_project_id
- return False
+ return False
def _convert(self, cr, uid, ids, xml_id, context=None):
data_obj = self.pool.get('ir.model.data')
- id2 = data_obj._get_id(cr, uid, 'project_issue', xml_id)
+ id2 = data_obj._get_id(cr, uid, 'project_issue', xml_id)
categ_id = False
if id2:
- categ_id = data_obj.browse(cr, uid, id2, context=context).res_id
+ categ_id = data_obj.browse(cr, uid, id2, context=context).res_id
if categ_id:
self.write(cr, uid, ids, {'categ_id': categ_id})
return True
-
+
def convert_to_feature(self, cr, uid, ids, context=None):
return self._convert(cr, uid, ids, 'feature_request_categ', context=context)
@@ -95,10 +134,10 @@ class project_issue(osv.osv):
return {'value':{'probability':stage.probability}}
_defaults = {
- 'project_id':_get_project,
- 'probability':lambda *a:0.0,
- 'planned_cost':lambda *a:0.0,
- 'planned_revenue':lambda *a:0.0,
+ 'project_id':_get_project,
+ 'probability':lambda *a:0.0,
+ 'planned_cost':lambda *a:0.0,
+ 'planned_revenue':lambda *a:0.0,
}
project_issue()
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 305db272f4c..8d6bbae0b5a 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -97,6 +97,8 @@
+
+