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