# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 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 . # ############################################################################## from osv import fields, osv, orm from datetime import datetime, timedelta import crm import math import time import mx.DateTime from tools.translate import _ from crm import crm_case class crm_lead(osv.osv, crm_case): """ CRM Lead Case """ _name = "crm.lead" _description = "Leads Cases" _order = "priority, id desc" _inherit = ['res.partner.address', 'mailgate.thread'] def _compute_day(self, cr, uid, ids, fields, args, context={}): """ @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of Openday’s IDs @return: difference between current date and log date @param context: A standard dictionary for contextual values """ 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 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 if ans: resource_id = False if lead.user_id: resource_ids = res_obj.search(cr, uid, [('user_id','=',lead.user_id.id)]) if len(resource_ids): resource_id = resource_ids[0] duration = float(ans.days) if lead.section_id and 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 _columns = { # From crm.case 'email_from': fields.char('Email', size=128, help="These people will receive email."), 'section_id': fields.many2one('crm.case.section', 'Sales Team', \ select=True, help='Sales team to which Case belongs to.\ Define Responsible user and Email account for mail gateway.'), 'create_date': fields.datetime('Creation Date' , readonly=True), 'email_cc': fields.text('Watchers Emails', size=252 , help="These \ people will receive a copy of the future communication between partner \ and users by email"), 'description': fields.text('Description'), 'write_date': fields.datetime('Update Date' , readonly=True), # Lead fields 'categ_id': fields.many2one('crm.case.categ', 'Lead Source', \ domain="[('section_id','=',section_id),\ ('object_id.model', '=', 'crm.lead')]"), 'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', \ domain="[('section_id','=',section_id),\ ('object_id.model', '=', 'crm.lead')]"), 'partner_name': fields.char("Partner Name", size=64), 'type':fields.selection([ ('lead','Lead'), ('opportunity','Opportunity'), ],'Type', help="Type is used to separate Leads and Opportunities"), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), 'date_closed': fields.datetime('Closed', readonly=True), 'stage_id': fields.many2one('crm.case.stage', 'Stage', \ domain="[('section_id','=',section_id),\ ('object_id.model', '=', 'crm.lead')]"), 'user_id': fields.many2one('res.users', 'Salesman',help='By Default Salesman is Administrator when create New User'), 'referred': fields.char('Referred By', size=64), 'date_open': fields.datetime('Opened', readonly=True), 'day_open': fields.function(_compute_day, string='Days to Open', \ method=True, multi='day_open', type="float", store=True), 'day_close': fields.function(_compute_day, string='Days to Close', \ method=True, multi='day_close', type="float", store=True), 'function_name': fields.char('Function', size=64), 'state': fields.selection(crm.AVAILABLE_STATES, 'State', size=16, readonly=True, help='The state is set to \'Draft\', when a case is created.\ \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\'.'), } _defaults = { 'active': lambda *a: 1, 'user_id': crm_case._get_default_user, 'email_from': crm_case._get_default_email, 'state': lambda *a: 'draft', 'section_id': crm_case._get_section, 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c), 'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0], } def case_open(self, cr, uid, ids, *args): """Overrides cancel for crm_case for setting Open Date @param self: The object pointer @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of case's Ids @param *args: Give Tuple Value """ 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 case_close(self, cr, uid, ids, *args): """Overrides close for crm_case for setting close date @param self: The object pointer @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of case Ids @param *args: Tuple Value for additional Params """ res = super(crm_lead, self).case_close(cr, uid, ids, args) self.write(cr, uid, ids, {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}) return res def convert_opportunity(self, cr, uid, ids, context=None): """ Precomputation for converting lead to opportunity @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of closeday’s IDs @param context: A standard dictionary for contextual values @return: Value of action in dict """ if not context: context = {} context.update({'active_ids': ids}) data_obj = self.pool.get('ir.model.data') data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_create') value = {} view_id = False if data_id: view_id = data_obj.browse(cr, uid, data_id, context=context).res_id for case in self.browse(cr, uid, ids): context.update({'active_id': case.id}) if not case.partner_id: data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_partner') view_id1 = False if data_id: view_id1 = data_obj.browse(cr, uid, data_id, context=context).res_id value = { 'name': _('Create Partner'), 'view_type': 'form', 'view_mode': 'form,tree', 'res_model': 'crm.lead2opportunity.partner', 'view_id': False, 'context': context, 'views': [(view_id1, 'form')], 'type': 'ir.actions.act_window', 'target': 'new', 'nodestroy': True } break else: value = { 'name': _('Create Opportunity'), 'view_type': 'form', 'view_mode': 'form,tree', 'res_model': 'crm.lead2opportunity', 'view_id': False, 'context': context, 'views': [(view_id, 'form')], 'type': 'ir.actions.act_window', 'target': 'new', 'nodestroy': True } return value crm_lead() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: