diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 442471fa7b7..9b034890fed 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -24,7 +24,7 @@ from datetime import datetime, timedelta import crm import math import time -from mx import DateTime +import mx.DateTime from tools.translate import _ class crm_lead(osv.osv): @@ -44,15 +44,9 @@ class crm_lead(osv.osv): @param *args: Give Tuple Value """ - cases = self.browse(cr, uid, ids) - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - data.update({'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) - self.write(cr, uid, ids, data) - self._action(cr, uid, cases, 'open') - return True + res = super(crm_lead, self).case_open(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res def _compute_day(self, cr, uid, ids, fields, args, context={}): """ @@ -61,36 +55,52 @@ class crm_lead(osv.osv): @param ids: List of Openday’s IDs @return: difference between current date and log date @param context: A standard dictionary for contextual values - """ - log_obj = self.pool.get('crm.case.log') - model_obj = self.pool.get('ir.model') - cal_obj = self.pool.get('resource.calendar') - - model_ids = model_obj.search(cr, uid, [('model', '=', self._name)]) - model_id = False - if len(model_ids): - model_id = model_ids[0] + """ + cal_obj = self.pool.get('resource.calendar') + res_obj = self.pool.get('resource.resource') res = {} for lead in self.browse(cr, uid, ids , context): for field in fields: res[lead.id] = {} duration = 0 + ans = False if field == 'day_open': if lead.date_open: date_create = datetime.strptime(lead.create_date, "%Y-%m-%d %H:%M:%S") date_open = datetime.strptime(lead.date_open, "%Y-%m-%d %H:%M:%S") - ans = date_open - date_create - duration = float(ans.days) + (float(ans.seconds) / 86400) - + date_until = lead.date_open elif field == 'day_close': if lead.date_closed: date_create = datetime.strptime(lead.create_date, "%Y-%m-%d %H:%M:%S") date_close = datetime.strptime(lead.date_closed, "%Y-%m-%d %H:%M:%S") - + date_until = lead.date_closed ans = date_close - date_create - duration = float(ans.days) + (float(ans.seconds) / 86400) + if ans: + resource_id = False + if lead.user_id: + resource_ids = res_obj.search(cr, uid, [('user_id','=',lead.user_id.id)]) + resource_id = len(resource_ids) or resource_ids[0] + + duration = float(ans.days) + if lead.section_id.resource_calendar_id: + duration = float(ans.days) * 24 + new_dates = cal_obj.interval_get(cr, + uid, + lead.section_id.resource_calendar_id and lead.section_id.resource_calendar_id.id or False, + mx.DateTime.strptime(lead.create_date, '%Y-%m-%d %H:%M:%S'), + duration, + resource=resource_id + ) + no_days = [] + date_until = mx.DateTime.strptime(date_until, '%Y-%m-%d %H:%M:%S') + for in_time, out_time in new_dates: + if in_time.date not in no_days: + no_days.append(in_time.date) + if out_time > date_until: + break + duration = len(no_days) res[lead.id][field] = abs(int(duration)) return res diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index dd8373538ba..8ecebf27ec8 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -140,6 +140,7 @@ + diff --git a/addons/crm/crm_opportunity.py b/addons/crm/crm_opportunity.py index 7d15f5968f5..7150abc9de6 100644 --- a/addons/crm/crm_opportunity.py +++ b/addons/crm/crm_opportunity.py @@ -24,6 +24,7 @@ from osv import fields,osv,orm from tools.translate import _ import crm import time +import mx.DateTime AVAILABLE_STATES = [ ('draft','New'), @@ -50,15 +51,9 @@ class crm_opportunity(osv.osv): @param *args: Give Tuple Value """ - cases = self.browse(cr, uid, ids) - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - data.update({'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) - self.write(cr, uid, ids, data) - self._action(cr, uid, cases, 'open') - return True + res = super(crm_opportunity, self).case_open(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res def _compute_day(self, cr, uid, ids, fields, args, context={}): """ @@ -67,36 +62,52 @@ class crm_opportunity(osv.osv): @param ids: List of Openday’s IDs @return: difference between current date and log date @param context: A standard dictionary for contextual values - """ - log_obj = self.pool.get('crm.case.log') - model_obj = self.pool.get('ir.model') - cal_obj = self.pool.get('resource.calendar') - - model_ids = model_obj.search(cr, uid, [('model', '=', self._name)]) - model_id = False - if len(model_ids): - model_id = model_ids[0] + """ + cal_obj = self.pool.get('resource.calendar') + res_obj = self.pool.get('resource.resource') res = {} for opportunity in self.browse(cr, uid, ids , context): for field in fields: res[opportunity.id] = {} duration = 0 + ans = False if field == 'day_open': if opportunity.date_open: date_create = datetime.strptime(opportunity.create_date, "%Y-%m-%d %H:%M:%S") date_open = datetime.strptime(opportunity.date_open, "%Y-%m-%d %H:%M:%S") - ans = date_open - date_create - duration = float(ans.days) + (float(ans.seconds) / 86400) - + date_until = opportunity.date_open elif field == 'day_close': if opportunity.date_closed: date_create = datetime.strptime(opportunity.create_date, "%Y-%m-%d %H:%M:%S") date_close = datetime.strptime(opportunity.date_closed, "%Y-%m-%d %H:%M:%S") - + date_until = opportunity.date_closed ans = date_close - date_create - duration = float(ans.days) + (float(ans.seconds) / 86400) + if ans: + resource_id = False + if opportunity.user_id: + resource_ids = res_obj.search(cr, uid, [('user_id','=',opportunity.user_id.id)]) + resource_id = len(resource_ids) or resource_ids[0] + + duration = float(ans.days) + if opportunity.section_id.resource_calendar_id: + duration = float(ans.days) * 24 + new_dates = cal_obj.interval_get(cr, + uid, + opportunity.section_id.resource_calendar_id and opportunity.section_id.resource_calendar_id.id or False, + mx.DateTime.strptime(opportunity.create_date, '%Y-%m-%d %H:%M:%S'), + duration, + resource=resource_id + ) + no_days = [] + date_until = mx.DateTime.strptime(date_until, '%Y-%m-%d %H:%M:%S') + for in_time, out_time in new_dates: + if in_time.date not in no_days: + no_days.append(in_time.date) + if out_time > date_until: + break + duration = len(no_days) res[opportunity.id][field] = abs(int(duration)) return res diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml index f0a44c56c8c..b1e5e0d145c 100644 --- a/addons/crm/crm_view.xml +++ b/addons/crm/crm_view.xml @@ -20,6 +20,7 @@ + diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index f566e357dfd..1fb1c353bab 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -26,6 +26,7 @@ import time import time import tools from crm import crm +import mx.DateTime from datetime import datetime, timedelta from osv import fields,osv,orm from osv.orm import except_orm @@ -46,15 +47,9 @@ class project_issue(osv.osv): @param *args: Give Tuple Value """ - cases = self.browse(cr, uid, ids) - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - data.update({'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) - self.write(cr, uid, ids, data) - self._action(cr, uid, cases, 'open') - return True + res = super(project_issue, self).case_open(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res def _compute_day(self, cr, uid, ids, fields, args, context={}): """ @@ -63,37 +58,53 @@ class project_issue(osv.osv): @param ids: List of Openday’s IDs @return: difference between current date and log date @param context: A standard dictionary for contextual values - """ - log_obj = self.pool.get('crm.case.log') - model_obj = self.pool.get('ir.model') - cal_obj = self.pool.get('resource.calendar') - - model_ids = model_obj.search(cr, uid, [('model', '=', self._name)]) - model_id = False - if len(model_ids): - model_id = model_ids[0] + """ + cal_obj = self.pool.get('resource.calendar') + res_obj = self.pool.get('resource.resource') res = {} - for project in self.browse(cr, uid, ids , context): + for issue in self.browse(cr, uid, ids , context): for field in fields: - res[project.id] = {} + res[issue.id] = {} duration = 0 + ans = False if field == 'day_open': - if project.date_open: - date_create = datetime.strptime(project.create_date, "%Y-%m-%d %H:%M:%S") - date_open = datetime.strptime(project.date_open, "%Y-%m-%d %H:%M:%S") - + if issue.date_open: + date_create = datetime.strptime(issue.create_date, "%Y-%m-%d %H:%M:%S") + date_open = datetime.strptime(issue.date_open, "%Y-%m-%d %H:%M:%S") ans = date_open - date_create - duration = float(ans.days) + (float(ans.seconds) / 86400) - + date_until = issue.date_open elif field == 'day_close': - if project.date_closed: - date_create = datetime.strptime(project.create_date, "%Y-%m-%d %H:%M:%S") - date_close = datetime.strptime(project.date_closed, "%Y-%m-%d %H:%M:%S") - + if issue.date_closed: + date_create = datetime.strptime(issue.create_date, "%Y-%m-%d %H:%M:%S") + date_close = datetime.strptime(issue.date_closed, "%Y-%m-%d %H:%M:%S") + date_until = issue.date_closed ans = date_close - date_create - duration = float(ans.days) + (float(ans.seconds) / 86400) - res[project.id][field] = abs(int(duration)) + if ans: + resource_id = False + if issue.user_id: + resource_ids = res_obj.search(cr, uid, [('user_id','=',issue.user_id.id)]) + resource_id = len(resource_ids) or resource_ids[0] + + duration = float(ans.days) + if issue.section_id.resource_calendar_id: + duration = float(ans.days) * 24 + new_dates = cal_obj.interval_get(cr, + uid, + issue.section_id.resource_calendar_id and issue.section_id.resource_calendar_id.id or False, + mx.DateTime.strptime(issue.create_date, '%Y-%m-%d %H:%M:%S'), + duration, + resource=resource_id + ) + no_days = [] + date_until = mx.DateTime.strptime(date_until, '%Y-%m-%d %H:%M:%S') + for in_time, out_time in new_dates: + if in_time.date not in no_days: + no_days.append(in_time.date) + if out_time > date_until: + break + duration = len(no_days) + res[issue.id][field] = abs(int(duration)) return res _columns = { @@ -116,7 +127,7 @@ class project_issue(osv.osv): method=True, multi='day_open', type="integer", store=True), 'day_close': fields.function(_compute_day, string='Days to Close', \ method=True, multi='day_close', type="integer", store=True), - 'assigned_to' : fields.many2one('res.users', 'Assigned to'), + 'assigned_to' : fields.many2one('res.users', 'Assigned to'), 'timesheet_ids' : fields.one2many('hr.analytic.timesheet', 'issue_id', 'Timesheets'), 'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account', domain="[('partner_id', '=', partner_id)]",