2009-12-30 10:20:44 +00:00
# -*- coding: utf-8 -*-
##############################################################################
2010-01-08 11:05:05 +00:00
#
2009-12-30 10:20:44 +00:00
# OpenERP, Open Source Management Solution
2012-05-30 11:18:31 +00:00
# Copyright (C) 2004-today OpenERP SA (<http://www.openerp.com>)
2009-12-30 10:20:44 +00:00
#
# 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
2010-01-08 11:05:05 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2009-12-30 10:20:44 +00:00
#
##############################################################################
2013-10-06 11:58:08 +00:00
import openerp
2012-12-17 15:58:19 +00:00
from openerp . addons . crm import crm
2012-12-06 14:56:32 +00:00
from openerp . osv import fields , osv
from openerp import tools
from openerp . tools . translate import _
from openerp . tools import html2plaintext
2011-02-24 10:13:05 +00:00
2010-07-16 10:41:21 +00:00
2012-05-30 13:00:58 +00:00
class crm_claim_stage ( osv . osv ) :
""" Model for claim stages. This models the main stages of a claim
2012-10-02 10:29:15 +00:00
management flow . Main CRM objects ( leads , opportunities , project
2012-05-30 13:00:58 +00:00
issues , . . . ) will now use only stages , instead of state and stages .
Stages are for example used to display the kanban view of records .
2010-03-19 10:06:28 +00:00
"""
2012-05-30 13:00:58 +00:00
_name = " crm.claim.stage "
_description = " Claim stages "
_rec_name = ' name '
_order = " sequence "
_columns = {
2014-05-21 09:52:05 +00:00
' name ' : fields . char ( ' Stage Name ' , required = True , translate = True ) ,
2012-05-30 13:00:58 +00:00
' sequence ' : fields . integer ( ' Sequence ' , help = " Used to order stages. Lower is better. " ) ,
' section_ids ' : fields . many2many ( ' crm.case.section ' , ' section_claim_stage_rel ' , ' stage_id ' , ' section_id ' , string = ' Sections ' ,
help = " Link between stages and sales teams. When set, this limitate the current stage to the selected sales teams. " ) ,
' case_default ' : fields . boolean ( ' Common to All Teams ' ,
help = " If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams. " ) ,
}
_defaults = {
' sequence ' : lambda * args : 1 ,
}
2011-05-17 05:56:46 +00:00
2013-07-08 10:30:11 +00:00
class crm_claim ( osv . osv ) :
2012-05-22 15:07:06 +00:00
""" Crm claim
2010-03-19 10:06:28 +00:00
"""
2009-12-30 10:20:44 +00:00
_name = " crm.claim "
2010-07-22 11:00:56 +00:00
_description = " Claim "
2010-11-27 16:37:12 +00:00
_order = " priority,date desc "
2011-07-22 18:23:37 +00:00
_inherit = [ ' mail.thread ' ]
2012-08-21 14:27:47 +00:00
2013-07-08 10:30:11 +00:00
def _get_default_section_id ( self , cr , uid , context = None ) :
""" Gives default section by checking if present in the context """
return self . pool . get ( ' crm.lead ' ) . _resolve_section_id_from_context ( cr , uid , context = context ) or False
def _get_default_stage_id ( self , cr , uid , context = None ) :
""" Gives default stage_id """
section_id = self . _get_default_section_id ( cr , uid , context = context )
2013-07-16 15:38:18 +00:00
return self . stage_find ( cr , uid , [ ] , section_id , [ ( ' sequence ' , ' = ' , ' 1 ' ) ] , context = context )
2013-07-08 10:30:11 +00:00
2010-01-08 11:05:05 +00:00
_columns = {
2011-02-07 05:51:57 +00:00
' id ' : fields . integer ( ' ID ' , readonly = True ) ,
2014-05-21 09:52:05 +00:00
' name ' : fields . char ( ' Claim Subject ' , required = True ) ,
2011-11-23 13:24:10 +00:00
' active ' : fields . boolean ( ' Active ' ) ,
2014-05-21 09:52:05 +00:00
' action_next ' : fields . char ( ' Next Action ' ) ,
2010-11-27 16:37:12 +00:00
' date_action_next ' : fields . datetime ( ' Next Action Date ' ) ,
2011-02-07 05:51:57 +00:00
' description ' : fields . text ( ' Description ' ) ,
' resolution ' : fields . text ( ' Resolution ' ) ,
' create_date ' : fields . datetime ( ' Creation Date ' , readonly = True ) ,
' write_date ' : fields . datetime ( ' Update Date ' , readonly = True ) ,
' date_deadline ' : fields . date ( ' Deadline ' ) ,
' date_closed ' : fields . datetime ( ' Closed ' , readonly = True ) ,
2011-12-09 06:03:08 +00:00
' date ' : fields . datetime ( ' Claim Date ' , select = True ) ,
2013-10-06 11:58:08 +00:00
' ref ' : fields . reference ( ' Reference ' , selection = openerp . addons . base . res . res_request . referencable_models ) ,
2010-05-06 06:44:00 +00:00
' categ_id ' : fields . many2one ( ' crm.case.categ ' , ' Category ' , \
2010-03-22 10:40:26 +00:00
domain = " [( ' section_id ' , ' = ' ,section_id), \
2011-02-07 05:51:57 +00:00
( ' object_id.model ' , ' = ' , ' crm.claim ' ) ] " ),
2014-02-14 11:49:37 +00:00
' priority ' : fields . selection ( [ ( ' 0 ' , ' Low ' ) , ( ' 1 ' , ' Normal ' ) , ( ' 2 ' , ' High ' ) ] , ' Priority ' ) ,
2010-09-28 21:53:48 +00:00
' type_action ' : fields . selection ( [ ( ' correction ' , ' Corrective Action ' ) , ( ' prevention ' , ' Preventive Action ' ) ] , ' Action Type ' ) ,
2014-06-24 14:07:00 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Responsible ' , track_visibility = ' always ' ) ,
2014-05-21 09:52:05 +00:00
' user_fault ' : fields . char ( ' Trouble Responsible ' ) ,
2010-05-06 06:44:00 +00:00
' section_id ' : fields . many2one ( ' crm.case.section ' , ' Sales Team ' , \
2012-10-23 12:04:15 +00:00
select = True , help = " Responsible sales team. " \
2012-11-01 05:19:57 +00:00
" Define Responsible user and Email account for " \
2011-02-07 05:51:57 +00:00
" mail gateway. " ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' ) ,
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' ) ,
' email_cc ' : fields . text ( ' Watchers Emails ' , size = 252 , help = " These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma " ) ,
2012-10-23 12:04:15 +00:00
' email_from ' : fields . char ( ' Email ' , size = 128 , help = " Destination email for email gateway. " ) ,
2014-05-21 09:52:05 +00:00
' partner_phone ' : fields . char ( ' Phone ' ) ,
2012-12-20 11:47:30 +00:00
' stage_id ' : fields . many2one ( ' crm.claim.stage ' , ' Stage ' , track_visibility = ' onchange ' ,
2013-03-21 12:56:26 +00:00
domain = " [ ' | ' , ( ' section_ids ' , ' = ' , section_id), ( ' case_default ' , ' = ' , True)] " ) ,
2011-02-07 05:51:57 +00:00
' cause ' : fields . text ( ' Root Cause ' ) ,
2010-01-11 11:11:20 +00:00
}
2011-02-07 05:51:57 +00:00
2010-01-11 11:11:20 +00:00
_defaults = {
2013-07-08 10:30:11 +00:00
' user_id ' : lambda s , cr , uid , c : uid ,
2012-05-25 07:33:12 +00:00
' section_id ' : lambda s , cr , uid , c : s . _get_default_section_id ( cr , uid , c ) ,
2013-09-19 14:23:38 +00:00
' date ' : fields . datetime . now ,
2011-02-07 05:51:57 +00:00
' company_id ' : lambda s , cr , uid , c : s . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' crm.case ' , context = c ) ,
2014-02-14 11:49:37 +00:00
' priority ' : ' 1 ' ,
2012-10-10 11:33:23 +00:00
' active ' : lambda * a : 1 ,
2013-07-08 10:30:11 +00:00
' stage_id ' : lambda s , cr , uid , c : s . _get_default_stage_id ( cr , uid , c )
2009-12-30 10:20:44 +00:00
}
2011-02-07 05:51:57 +00:00
2012-05-24 16:18:56 +00:00
def stage_find ( self , cr , uid , cases , section_id , domain = [ ] , order = ' sequence ' , context = None ) :
""" Override of the base.stage method
Parameter of the stage search taken from the lead :
- section_id : if set , stages must belong to this section or
be a default case
"""
if isinstance ( cases , ( int , long ) ) :
cases = self . browse ( cr , uid , cases , context = context )
2012-05-31 14:26:47 +00:00
# collect all section_ids
section_ids = [ ]
2012-05-24 16:18:56 +00:00
if section_id :
2012-05-31 14:26:47 +00:00
section_ids . append ( section_id )
for claim in cases :
if claim . section_id :
section_ids . append ( claim . section_id . id )
# OR all section_ids and OR with case_default
search_domain = [ ]
if section_ids :
search_domain + = [ ( ' | ' ) ] * len ( section_ids )
for section_id in section_ids :
search_domain . append ( ( ' section_ids ' , ' = ' , section_id ) )
search_domain . append ( ( ' case_default ' , ' = ' , True ) )
# AND with the domain in parameter
search_domain + = list ( domain )
# perform search, return the first found
stage_ids = self . pool . get ( ' crm.claim.stage ' ) . search ( cr , uid , search_domain , order = order , context = context )
2012-05-24 16:18:56 +00:00
if stage_ids :
return stage_ids [ 0 ]
return False
2012-03-21 09:28:23 +00:00
2013-07-08 10:30:11 +00:00
def onchange_partner_id ( self , cr , uid , ids , partner_id , email = False , context = None ) :
2010-06-24 13:15:38 +00:00
""" This function returns value of partner address based on partner
2011-07-22 18:23:37 +00:00
: param email : ignored
2010-06-24 13:15:38 +00:00
"""
2013-07-08 10:30:11 +00:00
if not partner_id :
return { ' value ' : { ' email_from ' : False , ' partner_phone ' : False } }
address = self . pool . get ( ' res.partner ' ) . browse ( cr , uid , partner_id , context = context )
2011-11-14 22:08:36 +00:00
return { ' value ' : { ' email_from ' : address . email , ' partner_phone ' : address . phone } }
2011-02-07 05:51:57 +00:00
2013-07-08 10:30:11 +00:00
def create ( self , cr , uid , vals , context = None ) :
2014-07-06 14:44:26 +00:00
context = dict ( context or { } )
2013-07-08 10:30:11 +00:00
if vals . get ( ' section_id ' ) and not context . get ( ' default_section_id ' ) :
context [ ' default_section_id ' ] = vals . get ( ' section_id ' )
# context: no_log, because subtype already handle this
return super ( crm_claim , self ) . create ( cr , uid , vals , context = context )
2014-06-24 05:56:49 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
claim = self . browse ( cr , uid , id , context = context )
default = dict ( default or { } ,
stage_id = self . _get_default_stage_id ( cr , uid , context = context ) ,
name = _ ( ' %s (copy) ' ) % claim . name )
return super ( crm_claim , self ) . copy ( cr , uid , id , default , context = context )
2012-06-04 14:12:54 +00:00
# -------------------------------------------------------
# Mail gateway
# -------------------------------------------------------
2011-07-22 18:23:37 +00:00
def message_new ( self , cr , uid , msg , custom_values = None , context = None ) :
2012-06-04 14:12:54 +00:00
""" Overrides mail_thread message_new that is called by the mailgateway
through message_process .
This override updates the document according to the email .
"""
2013-11-04 09:27:31 +00:00
if custom_values is None :
custom_values = { }
2012-10-09 15:54:20 +00:00
desc = html2plaintext ( msg . get ( ' body ' ) ) if msg . get ( ' body ' ) else ' '
2013-01-10 17:27:23 +00:00
defaults = {
2012-06-04 14:12:54 +00:00
' name ' : msg . get ( ' subject ' ) or _ ( " No Subject " ) ,
2012-10-09 15:54:20 +00:00
' description ' : desc ,
2012-06-04 14:12:54 +00:00
' email_from ' : msg . get ( ' from ' ) ,
2011-02-15 09:42:10 +00:00
' email_cc ' : msg . get ( ' cc ' ) ,
2013-01-15 13:43:59 +00:00
' partner_id ' : msg . get ( ' author_id ' , False ) ,
2013-01-10 17:27:23 +00:00
}
2012-06-04 14:12:54 +00:00
if msg . get ( ' priority ' ) :
2013-01-10 17:27:23 +00:00
defaults [ ' priority ' ] = msg . get ( ' priority ' )
defaults . update ( custom_values )
2013-11-04 09:27:31 +00:00
return super ( crm_claim , self ) . message_new ( cr , uid , msg , custom_values = defaults , context = context )
2011-02-15 09:42:10 +00:00
2011-05-17 05:56:46 +00:00
class res_partner ( osv . osv ) :
_inherit = ' res.partner '
2014-03-24 05:09:21 +00:00
def _claim_count ( self , cr , uid , ids , field_name , arg , context = None ) :
2014-05-07 08:17:23 +00:00
Claim = self . pool [ ' crm.claim ' ]
return {
partner_id : Claim . search_count ( cr , uid , [ ( ' partner_id ' , ' = ' , partner_id ) ] , context = context )
for partner_id in ids
}
2011-05-17 05:56:46 +00:00
_columns = {
2014-03-24 05:09:21 +00:00
' claim_count ' : fields . function ( _claim_count , string = ' # Claims ' , type = ' integer ' ) ,
2011-05-17 05:56:46 +00:00
}
2010-12-14 13:19:59 +00:00
2010-04-28 11:41:59 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: