Esempio n. 1
0
    def import_ticket(self, cr, uid, ids, context=None):
        task_pool     = self.pool.get('project.task')
        ttype_pool    = self.pool.get('project.task.type')
        project_pool  = self.pool.get('project.project')
        partner_pool  = self.pool.get('res.partner')
        klog          = self.pool.get('kayako.logs')

        sobj = self.browse(cr, uid, ids[0])

        if not sobj.ticket_state: 
            raise osv.except_osv(_("Can not Proceed!"), _("Missing Tickets status in configuration!"))
        
        if not sobj.department_id:
            raise osv.except_osv(_("Can not Proceed!"), _("Missing Department in configuration!"))

        kayako_obj = KayakoAPI(sobj.api_url, sobj.api_key, sobj.secret_key)


        # UPDATE STATUS BACK TO KAYAKO FIRST 
        
        update_task_ids = task_pool.search(cr, uid, [('update_state','=',True)])
        klog.create(cr, uid, {'config_id':sobj.id,  'message': " %s Tickets to update back to kayako  ..." %(len(update_task_ids))})

        for task in task_pool.browse(cr, uid, update_task_ids):
            ticket = kayako_obj.get(Ticket, task.kayako_ticket_id)
            if ticket:
                _logger.warning('Ticket %s : Status ID %s' %(ticket.displayid, ticket.statusid))
                if ticket.statusid != task.kayako_config_id.export_state.kayako_id:
                    ticket.ticketstatusid = task.kayako_config_id.export_state and task.kayako_config_id.export_state.kayako_id
                    ticket.save() 

                    response = save_status(sobj.api_url, sobj.api_key, sobj.secret_key, ticket.id, task.kayako_config_id.export_state.kayako_id)
                    if response and response.code == 200:
                        klog.create(cr, uid, {'config_id':sobj.id,  'message': "Invoiced Ticket Updated ..."+ str(ticket.id)+" "+str(ticket.displayid)})
                        task.write({'update_state':False, 'stage_id' : task.kayako_config_id.export_state.id })
                    else:
                        klog.create(cr, uid, {'config_id':sobj.id,  'message': "Invoiced Ticket Update Fail ..."+ str(ticket.id)+" "+str(ticket.displayid)})
                else:
                    task.write({'update_state':False, 'stage_id' : task.kayako_config_id.export_state.id})
                    
        # Start Import        
        tickets = kayako_obj.get_all(Ticket, sobj.department_id.kayako_id, ticketstatusid=sobj.ticket_state.kayako_id)
        if not tickets:
            _logger.warning('No Tickets to download')

        kayako_ticket_ids = []
        
        if tickets:
            worker_staff = kayako_obj.get_all(Staff)
            
        for ticket in tickets:
            
            ticket_handle = str(ticket.id) + " " + str(ticket.displayid)

            kayako_ticket_ids.append(ticket.id)
            task_exists = task_pool.search(cr, uid, [('kayako_ticket_id', '=', ticket.id)])
            if task_exists:

                task_val = {}
                
                task = task_pool.browse(cr, uid, task_exists[0])
                if task.name != ticket.subject:
                    task_val['name'] = ticket.subject

                if task.stage_id.id != sobj.ticket_state.id:
                    task_val['stage_id'] = sobj.ticket_state.id
                    
                user = kayako_obj.get(User, ticket.userid)
                if not user.userorganizationid:
                    klog.create(cr, uid, {'config_id':sobj.id,  'message': "Organization is missing, Update aborted..."+ str(ticket.id)+" "+str(ticket.displayid)})
                    continue

                customer_data = kayako_obj.get(UserOrganization, user.userorganizationid)
                customer_ids = partner_pool.search(cr, uid, [('name','=', customer_data.name)])
                if not customer_ids:
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Organization is not found, Update aborted... - Ticket: %s" + str(ticket.id) + " " + str(ticket.displayid) })
                    continue
                elif task.project_id.partner_id.id != customer_ids[0]:
                    task_val['partner_id'] = customer_ids[0]
                    project_ids = project_pool.search(cr,uid,[('partner_id','=',customer_ids[0])])
                    if project_ids:
                        task_val['project_id'] = project_ids[0]

                if task_val:                        
                    task_pool.write(cr, uid, [task_exists[0]], task_val)
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Updated : " + str(ticket.id) + " " + str(ticket.displayid) })
                else:
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Update - No Change : " + str(ticket.id) + " " + str(ticket.displayid) })
                    

                if ticket.timetracks:
                    for timetrack in ticket.timetracks:
                        hours = round(float(timetrack.timespent) / 3600,2)
                        work_ids = self.pool.get('project.task.work').search(cr, uid, [('kayako_timetrack_id','=', timetrack.id)])
                        work_line = {
                                        'name' : timetrack.contents,
                                        'task_id' : task_exists[0],
                                        'user_id' : self.get_staff_user(cr, uid, worker_staff, timetrack.workerstaffid) or 1,
                                        'date' : str(timetrack.worktimeline) or False,
                                        'hours' : hours,
                                        'kayako_timetrack_id':timetrack.id
                                    }
                        if not work_ids: 
                            self.pool.get('project.task.work').create(cr, uid, work_line)
                        else:
                            self.pool.get('project.task.work').write(cr, uid, work_ids, work_line)
                continue

            # FROM HERE ON -- IF TASK IS NOT EXISTS
            user = kayako_obj.get(User, ticket.userid)
            if not user.userorganizationid:
                klog.create(cr, uid, {'config_id':sobj.id,  'message': "Organization is missing, Skipped..."+ str(ticket.id)+" "+str(ticket.displayid)})
                continue

            user_email=(user.email)[0]
            inactive_taskid = task_pool.search(cr, uid, [('kayako_ticket_id', '=', ticket.id),('active', '=', False)])
            if inactive_taskid:
                self.pool.get('project.task').write(cr, uid,inactive_taskid, {'active':True,'stage_id':stage_id})
                continue

            partner_ids = partner_pool.search(cr, uid, [('name','=', user.fullname)])
            if partner_ids:
                partner_id = partner_ids[0]
                partner = partner_pool.browse(cr, uid, partner_id)
                if not partner.parent_id:
                    customer_data = kayako_obj.get(UserOrganization, user.userorganizationid)
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "User (%s) Exists, User's Organization (%s) missing, Skipped... - Ticket: %s" %(user.fullname, customer_data.name, ticket_handle)})
                    continue
                else:
                    customer_id = partner.parent_id.id
                    
            elif sobj.create_user:
                customer_data = kayako_obj.get(UserOrganization, user.userorganizationid)
                customer_ids = partner_pool.search(cr, uid, [('name','=', customer_data.name)])
                if not customer_ids:
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "User (%s) and Organization (%s), both missing, Skipped... - Ticket: %s" %(user.fullname, customer_data.name, ticket_handle) })
                    continue
                else:
                    customer_id = customer_ids[0]
                    partner_id = partner_pool.create(cr, uid, {'name': user.fullname, 'email' : user_email, 'is_company': False, 'parent_id':customer_id, 'kayako_user_id':ticket.userid })
            else:
                klog.create(cr, uid, {'config_id':sobj.id, 'message': "User is missing, Skipped..."+ str(ticket.id)+" "+str(ticket.displayid)})
                continue

            print "Customer IDS", customer_id

            project_ids = project_pool.search(cr, uid, [('partner_id','=', customer_id)])
            if not project_ids:
                customer = partner_pool.browse(cr, uid, customer_id)
                project_id = project_pool.create(cr, uid, { 'name' : customer.name, 'partner_id' : customer.id})
            else:
                project_id = project_ids[0]

            
            task_vals = {
                            'project_id' : project_id,
                            'name'       : ticket.subject,
                            'partner_id' : partner_id,
                            'kayako_ticket_id' : ticket.id,
                            'kayako_ticket_displayid' : ticket.displayid,
                            'kayako_config_id' :sobj.id,
                            'stage_id'   :sobj.ticket_state.id
            }

            task_id = task_pool.create(cr, uid, task_vals)
            if ticket.timetracks:
                for timetrack in ticket.timetracks:
                    hours = round(float(timetrack.timespent) / 3600,2)
                    self.pool.get('project.task.work').create(cr, uid, {
                                                                        'name' : timetrack.contents,
                                                                        'task_id' : task_id,
                                                                        'user_id' : self.get_staff_user(cr, uid, worker_staff, timetrack.workerstaffid) or 1,
                                                                        'date' : str(timetrack.worktimeline) or False,
                                                                        'hours' : hours,
                                                                        'kayako_timetrack_id':timetrack.id
                                                                        })
            klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Created Successfully :" +str(ticket.id)+" "+str(ticket.displayid)})

        # Update moved status tickets  - 
        moved_task_ids = task_pool.search(cr, uid, [('kayako_ticket_id', 'not in', kayako_ticket_ids), ('stage_id', '=', sobj.ticket_state.id), ('invoiced', '!=', True)])
        klog.create(cr, uid, {'config_id':sobj.id, 'message': "Checking/Updating Status of %s Tickets" %(len(moved_task_ids))})

        if moved_task_ids:
            tt_status_map = dict( [ (tt.kayako_id, tt.id) for tt in ttype_pool.browse(cr, uid, ttype_pool.search(cr, uid, [])) if tt.kayako_id ] )

            for moved_task in task_pool.browse(cr, uid, moved_task_ids):
                mv_ticket = kayako_obj.get(Ticket, moved_task.kayako_ticket_id)
                if moved_task.stage_id.id != tt_status_map[mv_ticket.statusid]:
                    moved_task.write({ 'stage_id' : tt_status_map[mv_ticket.statusid] })
                    klog.create(cr, uid, {'config_id':sobj.id, 'message': "Ticket Status Updated (Moved Tickets) :" +str(mv_ticket.id)+" "+str(mv_ticket.displayid)})



        return True