[MERGE] config-rework2, rpa apr
[odoo/odoo.git] / addons / crm_claim / crm_claim.py
index 1625cc2..c575508 100644 (file)
 from osv import fields, osv
 from crm import crm
 import time
-class crm_claim(osv.osv, crm.crm_case):
+import binascii
+import tools
+from tools.translate import _
+
+CRM_CLAIM_PENDING_STATES = (
+    crm.AVAILABLE_STATES[2][0], # Cancelled
+    crm.AVAILABLE_STATES[3][0], # Done
+    crm.AVAILABLE_STATES[4][0], # Pending
+)
+
+
+class crm_claim(crm.crm_case, osv.osv):
     """
     Crm claim
     """
     _name = "crm.claim"
-    _description = "Claim Cases"
-    _order = "id desc"
+    _description = "Claim"
+    _order = "priority,date desc"
     _inherit = ['mailgate.thread']
     _columns = {
         'id': fields.integer('ID', readonly=True), 
-        'name': fields.char('Name', size=128, required=True), 
-        'active': fields.boolean('Active', required=False), 
-        'date_action_last': fields.datetime('Last Action', readonly=1),
-        'date_action_next': fields.datetime('Next Action', readonly=1),
+        'name': fields.char('Claim Subject', size=128, required=True), 
+        'action_next': fields.char('Next Action', size=200),
+        'date_action_next': fields.datetime('Next Action Date'),
         '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('Date'), 
+        'date': fields.datetime('Claim Date'), 
         'ref' : fields.reference('Reference', selection=crm._links_get, size=128), 
-        'ref2' : fields.reference('Reference 2', selection=crm._links_get, size=128), 
-        'canal_id': fields.many2one('res.partner.canal', 'Channel', \
-                     help="The channels represent the different communication"\
-                      "modes available with the customer." \
-                     " With each commercial opportunity, you can indicate the"\
-                      "canall which is this opportunity source."), 
-        'planned_revenue': fields.float('Planned Revenue'), 
-        'planned_cost': fields.float('Planned Costs'), 
-        'som': fields.many2one('res.partner.som', 'State of Mind', \
-                        help="The minds states allow to define a value scale "\
-                            "which represents the partner mentality in "\
-                            "relation to our services.The scale has to be "\
-                            "created with a factor for each level from 0 "\
-                            "(Very dissatisfied) to 10 (Extremely satisfied)"), 
         'categ_id': fields.many2one('crm.case.categ', 'Category', \
                             domain="[('section_id','=',section_id),\
                             ('object_id.model', '=', 'crm.claim')]"), 
         'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), 
-        'type_id': fields.many2one('crm.case.resource.type', 'Claim Type', \
-                         domain="[('section_id','=',section_id),\
-                         ('object_id.model', '=', 'crm.claim')]"), 
+        'type_action': fields.selection([('correction','Corrective Action'),('prevention','Preventive Action')], 'Action Type'),
         'user_id': fields.many2one('res.users', 'Responsible'), 
+        'user_fault': fields.char('Trouble Responsible', size=64), 
         '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"\
@@ -74,24 +70,47 @@ class crm_claim(osv.osv, crm.crm_case):
         'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
                                 # domain="[('partner_id','=',partner_id)]"
                                  ), 
-        'email_cc': fields.text('Watchers Emails', size=252, help="These addresses(Comma-separated) will receive a copy of the future communication between partner and users"), 
+        '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_name': fields.char("Employee's Name", size=64), 
-        'partner_mobile': fields.char('Mobile', size=32), 
         'partner_phone': fields.char('Phone', size=32), 
-        'stage_id': fields.many2one ('crm.case.stage', 'Stage'), 
-        'probability': fields.float('Probability (%)'), 
+        '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, 
                                   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\'.'), 
-        'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True),('model','=',_name)]),
-        'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)]),
+        'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
     }
+    
+    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)
+            self.history(cr, uid, ids, _("Changed Stage to: ") + stage_obj.name)
+        return stage
+
+    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)
+            self.history(cr, uid, ids, _("Changed Stage to: ") + stage_obj.name)
+        return stage
+    
+    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
+        """
+        if context is None:
+            context = {}
+        type = context and context.get('stage_type', '')
+        stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('type','=',type),('sequence','>=',1)])
+        return stage_ids and stage_ids[0] or False
 
     _defaults = {
-        'active': lambda *a: 1, 
         '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, 
@@ -100,7 +119,8 @@ class crm_claim(osv.osv, crm.crm_case):
         'section_id':crm.crm_case. _get_section, 
         'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
         'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c), 
-        'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0], 
+        'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+        #'stage_id': _get_stage_id, 
     }
     
     def onchange_partner_id(self, cr, uid, ids, part, email=False):
@@ -121,7 +141,6 @@ class crm_claim(osv.osv, crm.crm_case):
         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'])
-        print data
         return {'value': data}
 
     def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
@@ -137,8 +156,138 @@ class crm_claim(osv.osv, crm.crm_case):
             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}}
+        
+    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)
+        
+        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})
+        
+        return res
+    
+    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
+        """
+        mailgate_pool = self.pool.get('email.server.tools')
+
+        subject = msg.get('subject') or _("No 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
+
+        res = mailgate_pool.get_partner(cr, uid, msg.get('from') or msg.get_unixfrom())
+        if res:
+            vals.update(res)
+
+        res = self.create(cr, uid, vals, context)
+        attachents = msg.get('attachments', [])
+        for attactment in attachents or []:
+            data_attach = {
+                'name': attactment,
+                'datas':binascii.b2a_base64(str(attachents.get(attactment))),
+                'datas_fname': attactment,
+                'description': 'Mail attachment',
+                'res_model': self._name,
+                'res_id': res,
+            }
+            self.pool.get('ir.attachment').create(cr, uid, data_attach)
 
+        return res
+
+    def message_update(self, cr, uid, ids, vals={}, msg="", default_act='pending', context=None):
+        """
+        @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 update mail’s IDs 
+        """
+        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)
+        return res
+
+    def msg_send(self, cr, uid, id, *args, **argv):
+
+        """ Send The Message
+            @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 email’s IDs
+            @param *args: Return Tuple Value
+            @param **args: Return Dictionary of Keyword Value
+        """
+        return True
 
 crm_claim()
 
+class res_partner(osv.osv):
+   
+    _inherit = 'res.partner'
+    _columns = {
+        'claims_ids': fields.one2many('crm.claim', 'partner_id', 'Claims'),
+    }
+res_partner()
+
+class crm_stage_claim(osv.osv):
+    
+    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
+    
+    _inherit = "crm.case.stage"
+    _columns = {
+            'type': fields.selection(_get_type_value, 'Type'),
+    }
+   
+    
+crm_stage_claim()
+
+
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: