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
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
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
#
##############################################################################
from osv import fields , osv
2010-04-28 11:41:59 +00:00
from crm import crm
2010-06-24 13:15:38 +00:00
import time
2011-02-24 10:13:05 +00:00
from crm import wizard
2011-02-15 09:42:10 +00:00
import binascii
import tools
2011-03-15 13:46:32 +00:00
from tools . translate import _
2011-02-24 10:13:05 +00:00
wizard . email_compose_message . email_model . append ( ' crm.claim ' )
2011-02-15 09:42:10 +00:00
CRM_CLAIM_PENDING_STATES = (
crm . AVAILABLE_STATES [ 2 ] [ 0 ] , # Cancelled
crm . AVAILABLE_STATES [ 3 ] [ 0 ] , # Done
crm . AVAILABLE_STATES [ 4 ] [ 0 ] , # Pending
)
2010-07-16 10:41:21 +00:00
2010-08-17 12:54:00 +00:00
class crm_claim ( crm . crm_case , osv . osv ) :
2010-03-19 10:06:28 +00:00
"""
Crm claim
"""
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-03-18 13:44:19 +00:00
_inherit = [ ' email.thread ' ]
2010-01-08 11:05:05 +00:00
_columns = {
2011-02-07 05:51:57 +00:00
' id ' : fields . integer ( ' ID ' , readonly = True ) ,
' name ' : fields . char ( ' Claim Subject ' , size = 128 , required = True ) ,
2010-11-27 16:37:12 +00:00
' action_next ' : fields . char ( ' Next Action ' , size = 200 ) ,
' 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 ) ,
' date ' : fields . datetime ( ' Claim Date ' ) ,
' ref ' : fields . reference ( ' Reference ' , selection = crm . _links_get , size = 128 ) ,
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 ' ) ] " ),
' priority ' : fields . selection ( crm . AVAILABLE_PRIORITIES , ' Priority ' ) ,
2010-09-28 21:53:48 +00:00
' type_action ' : fields . selection ( [ ( ' correction ' , ' Corrective Action ' ) , ( ' prevention ' , ' Preventive Action ' ) ] , ' Action Type ' ) ,
2011-02-07 05:51:57 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Responsible ' ) ,
' user_fault ' : fields . char ( ' Trouble Responsible ' , size = 64 ) ,
2010-05-06 06:44:00 +00:00
' section_id ' : fields . many2one ( ' crm.case.section ' , ' Sales Team ' , \
2010-05-12 13:16:01 +00:00
select = True , help = " Sales team to which Case belongs to. " \
" 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 ' ) ,
2010-05-06 06:44:00 +00:00
' partner_address_id ' : fields . many2one ( ' res.partner.address ' , ' Partner Contact ' , \
2010-06-15 12:41:14 +00:00
# domain="[('partner_id','=',partner_id)]"
2011-02-07 05:51:57 +00:00
) ,
' 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 " ) ,
' email_from ' : fields . char ( ' Email ' , size = 128 , help = " These people will receive email. " ) ,
' partner_phone ' : fields . char ( ' Phone ' , size = 32 ) ,
' stage_id ' : fields . many2one ( ' crm.case.stage ' , ' Stage ' , domain = " [( ' type ' , ' = ' , ' claim ' )] " ) ,
' cause ' : fields . text ( ' Root Cause ' ) ,
' state ' : fields . selection ( crm . AVAILABLE_STATES , ' State ' , size = 16 , readonly = True ,
2010-05-06 06:44:00 +00:00
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 \' . \
2011-02-07 05:51:57 +00:00
\nIf the case needs to be reviewed then the state is set to \' Pending \' . ' ) ,
' message_ids ' : fields . one2many ( ' email.message ' , ' res_id ' , ' Messages ' , domain = [ ( ' model ' , ' = ' , _name ) ] ) ,
2010-01-11 11:11:20 +00:00
}
2011-02-07 05:51:57 +00:00
2011-03-15 13:46:32 +00:00
def stage_next ( self , cr , uid , ids , context = None ) :
stage = super ( crm_claim , self ) . stage_next ( cr , uid , ids , context = context )
if stage :
stage_obj = self . pool . get ( ' crm.case.stage ' ) . browse ( cr , uid , stage , context = context )
2011-03-16 12:38:21 +00:00
self . history ( cr , uid , ids , _ ( " Changed Stage to: " ) + stage_obj . name )
2011-03-15 13:46:32 +00:00
return stage
2011-02-07 05:51:57 +00:00
2011-03-15 13:46:32 +00:00
def stage_previous ( self , cr , uid , ids , context = None ) :
stage = super ( crm_claim , self ) . stage_previous ( cr , uid , ids , context = context )
if stage :
stage_obj = self . pool . get ( ' crm.case.stage ' ) . browse ( cr , uid , stage , context = context )
2011-03-16 12:38:21 +00:00
self . history ( cr , uid , ids , _ ( " Changed Stage to: " ) + stage_obj . name )
2011-03-15 13:46:32 +00:00
return stage
2011-03-30 09:26:14 +00:00
2010-12-09 12:56:35 +00:00
def _get_stage_id ( self , cr , uid , context = None ) :
""" Finds type of stage according to object.
@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 context : A standard dictionary for contextual values
"""
2010-12-10 06:24:35 +00:00
if context is None :
context = { }
type = context and context . get ( ' stage_type ' , ' ' )
2010-12-09 12:56:35 +00:00
stage_ids = self . pool . get ( ' crm.case.stage ' ) . search ( cr , uid , [ ( ' type ' , ' = ' , type ) , ( ' sequence ' , ' >= ' , 1 ) ] )
2010-12-10 06:24:35 +00:00
return stage_ids and stage_ids [ 0 ] or False
2010-03-22 10:40:26 +00:00
2010-01-11 11:11:20 +00:00
_defaults = {
2011-02-07 05:51:57 +00:00
' user_id ' : crm . crm_case . _get_default_user ,
' partner_id ' : crm . crm_case . _get_default_partner ,
' partner_address_id ' : crm . crm_case . _get_default_partner_address ,
' email_from ' : crm . crm_case . _get_default_email ,
' state ' : lambda * a : ' draft ' ,
' section_id ' : crm . crm_case . _get_section ,
2010-06-24 13:15:38 +00:00
' date ' : lambda * a : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) ,
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 ) ,
2010-12-09 12:56:35 +00:00
' priority ' : lambda * a : crm . AVAILABLE_PRIORITIES [ 2 ] [ 0 ] ,
2011-02-07 05:51:57 +00:00
#'stage_id': _get_stage_id,
2009-12-30 10:20:44 +00:00
}
2011-02-07 05:51:57 +00:00
2010-06-24 13:15:38 +00:00
def onchange_partner_id ( self , cr , uid , ids , part , email = False ) :
""" This function returns value of partner address based on partner
@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 part : Partner ' s id
@email : Partner ' s email ID
"""
if not part :
return { ' value ' : { ' partner_address_id ' : False ,
2011-02-07 05:51:57 +00:00
' email_from ' : False ,
2010-06-24 13:15:38 +00:00
' partner_phone ' : False ,
' partner_mobile ' : False
} }
addr = self . pool . get ( ' res.partner ' ) . address_get ( cr , uid , [ part ] , [ ' contact ' ] )
data = { ' partner_address_id ' : addr [ ' contact ' ] }
data . update ( self . onchange_partner_address_id ( cr , uid , ids , addr [ ' contact ' ] ) [ ' value ' ] )
return { ' value ' : data }
def onchange_partner_address_id ( self , cr , uid , ids , add , email = False ) :
""" This function returns value of partner email based on Partner Address
@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 add : Id of Partner ' s address
@email : Partner ' s email ID
"""
if not add :
return { ' value ' : { ' email_from ' : False } }
address = self . pool . get ( ' res.partner.address ' ) . browse ( cr , uid , add )
return { ' value ' : { ' email_from ' : address . email , ' partner_phone ' : address . phone , ' partner_mobile ' : address . mobile } }
2011-02-07 05:51:57 +00:00
2010-12-16 10:28:40 +00:00
def case_open ( self , cr , uid , ids , * args ) :
"""
Opens Claim
"""
res = super ( crm_claim , self ) . case_open ( cr , uid , ids , * args )
claims = self . browse ( cr , uid , ids )
2011-02-07 05:51:57 +00:00
2010-12-16 10:28:40 +00:00
for i in xrange ( 0 , len ( ids ) ) :
if not claims [ i ] . stage_id :
stage_id = self . _find_first_stage ( cr , uid , ' claim ' , claims [ i ] . section_id . id or False )
self . write ( cr , uid , [ ids [ i ] ] , { ' stage_id ' : stage_id } )
2011-02-07 05:51:57 +00:00
2010-12-16 10:28:40 +00:00
return res
2011-03-18 13:44:19 +00:00
2011-02-15 09:42:10 +00:00
def message_new ( self , cr , uid , msg , context = None ) :
"""
Automatically calls when new email message arrives
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks
2011-04-04 10:42:03 +00:00
@param msg : dictionary object to contain email message data
2011-02-15 09:42:10 +00:00
"""
2011-03-18 13:44:19 +00:00
thread_pool = self . pool . get ( ' email.thread ' )
2011-02-15 09:42:10 +00:00
subject = msg . get ( ' subject ' )
body = msg . get ( ' body ' )
msg_from = msg . get ( ' from ' )
priority = msg . get ( ' priority ' )
vals = {
' name ' : subject ,
' email_from ' : msg_from ,
' email_cc ' : msg . get ( ' cc ' ) ,
' description ' : body ,
' user_id ' : False ,
}
if msg . get ( ' priority ' , False ) :
vals [ ' priority ' ] = priority
2011-04-04 10:42:03 +00:00
res = thread_pool . get_partner ( cr , uid , msg . get ( ' from ' , False ) )
2011-02-15 09:42:10 +00:00
if res :
vals . update ( res )
2011-04-20 06:06:05 +00:00
res_id = self . create ( cr , uid , vals , context )
2011-04-20 06:26:46 +00:00
attachments = msg . get ( ' attachments ' , { } )
2011-04-20 06:06:05 +00:00
self . history ( cr , uid , [ res_id ] , _ ( ' receive ' ) , history = True ,
subject = msg . get ( ' subject ' ) ,
email = msg . get ( ' to ' ) ,
details = msg . get ( ' body ' ) ,
email_from = msg . get ( ' from ' ) ,
email_cc = msg . get ( ' cc ' ) ,
message_id = msg . get ( ' message-id ' ) ,
references = msg . get ( ' references ' , False ) or msg . get ( ' in-reply-to ' , False ) ,
attach = attachments ,
email_date = msg . get ( ' date ' ) ,
2011-05-02 06:58:49 +00:00
body_html = msg . get ( ' body_html ' ) ,
sub_type = msg . get ( ' sub_type ' ) ,
headers = msg . get ( ' headers ' ) ,
2011-05-03 06:38:44 +00:00
priority = msg . get ( ' priority ' ) ,
2011-04-20 06:06:05 +00:00
context = context )
return res_id
2011-02-15 09:42:10 +00:00
2011-04-06 07:47:01 +00:00
def message_update ( self , cr , uid , ids , msg , vals = { } , default_act = ' pending ' , context = None ) :
2011-02-15 09:42:10 +00:00
"""
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
2011-03-18 13:44:19 +00:00
@param ids : List of update mail ’ s IDs
2011-02-15 09:42:10 +00:00
"""
if isinstance ( ids , ( str , int , long ) ) :
ids = [ ids ]
if msg . get ( ' priority ' ) in dict ( crm . AVAILABLE_PRIORITIES ) :
vals [ ' priority ' ] = msg . get ( ' priority ' )
maps = {
' cost ' : ' planned_cost ' ,
' revenue ' : ' planned_revenue ' ,
' probability ' : ' probability '
}
vls = { }
for line in msg [ ' body ' ] . split ( ' \n ' ) :
line = line . strip ( )
res = tools . misc . command_re . match ( line )
if res and maps . get ( res . group ( 1 ) . lower ( ) ) :
key = maps . get ( res . group ( 1 ) . lower ( ) )
vls [ key ] = res . group ( 2 ) . lower ( )
vals . update ( vls )
# Unfortunately the API is based on lists
# but we want to update the state based on the
# previous state, so we have to loop:
for case in self . browse ( cr , uid , ids , context = context ) :
values = dict ( vals )
if case . state in CRM_CLAIM_PENDING_STATES :
values . update ( state = crm . AVAILABLE_STATES [ 1 ] [ 0 ] ) #re-open
res = self . write ( cr , uid , [ case . id ] , values , context = context )
2011-04-20 08:11:41 +00:00
attachments = msg . get ( ' attachments ' , { } )
self . history ( cr , uid , ids , _ ( ' receive ' ) , history = True ,
subject = msg . get ( ' subject ' ) ,
email = msg . get ( ' to ' ) ,
details = msg . get ( ' body ' ) ,
email_from = msg . get ( ' from ' ) ,
email_cc = msg . get ( ' cc ' ) ,
message_id = msg . get ( ' message-id ' ) ,
references = msg . get ( ' references ' , False ) or msg . get ( ' in-reply-to ' , False ) ,
attach = attachments ,
email_date = msg . get ( ' date ' ) ,
2011-05-03 06:38:44 +00:00
body_html = msg . get ( ' body_html ' ) ,
sub_type = msg . get ( ' sub_type ' ) ,
headers = msg . get ( ' headers ' ) ,
priority = msg . get ( ' priority ' ) ,
2011-04-20 08:11:41 +00:00
context = context )
2011-02-15 09:42:10 +00:00
return res
2009-12-30 10:20:44 +00:00
crm_claim ( )
2009-12-31 12:57:20 +00:00
2010-12-14 13:19:59 +00:00
class crm_stage_claim ( osv . osv ) :
2011-02-07 05:51:57 +00:00
2010-12-14 13:19:59 +00:00
def _get_type_value ( self , cr , user , context ) :
list = super ( crm_stage_claim , self ) . _get_type_value ( cr , user , context )
list . append ( ( ' claim ' , ' Claim ' ) )
return list
2011-02-07 05:51:57 +00:00
2010-12-14 13:19:59 +00:00
_inherit = " crm.case.stage "
_columns = {
' type ' : fields . selection ( _get_type_value , ' Type ' ) ,
}
2011-02-07 05:51:57 +00:00
2010-12-14 13:19:59 +00:00
crm_stage_claim ( )
2010-04-28 11:41:59 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: