Problem ticket report
module Zendesk
require 'zendesk_api'
require 'csv'
require 'octokit'
def self.create_report
@zd = Zendesk.init
tickets = Zendesk.get_problem_tickets
tickets = Zendesk.get_incident_counts(tickets)
tickets = Zendesk.get_group_name(tickets)
tickets = Zendesk.get_github_labels(tickets)
Zendesk.export_to_csv(tickets)
end
def self.google
end
def self.export_to_csv(tickets)
print "Exporting tickets"
CSV.open("problem_tickets.csv", "wb") do |csv|
csv << ["ID","status","Subject", "URL", "Created At","Group ID","Group Name","GH URL","Repo","7 Days","30 Days","60 Days","Total Incident Count","ZD Tags","Github Labels"]
tickets.each do |ticket|
print "."
csv << [ticket["id"],
ticket["status"],
ticket["subject"],
ticket["url"],
ticket["created_at"],
ticket["group_id"],
ticket["group_name"],
ticket["gh_url"],
ticket["repo"],
ticket["seven"],
ticket["thirty"],
ticket["sixty"],
ticket["incident_count"],
ticket["tags"],
ticket["github_labels"]
]
end
end
print "\n"
print "Done"
nil
end
def self.get_github_labels(tickets)
print "Getting Github labels"
updated_tickets = []
gh = Octokit::Client.new(:access_token => GH_TOKEN)
tickets.each do |t|
print "."
labels = []
if t["gh_url"] == nil
t["github_labels"] = ""
else
issue_number = t["gh_url"].match(/issues\/([\d]*)/)[1]
issue = gh.issue("Shopify/#{t["repo"]}", issue_number)
issue[:labels].each do |label|
labels << label[:name]
end
t["github_labels"] = labels.to_s.gsub(/"|\[|\]/, '')
end
updated_tickets << t
end
print "\n"
updated_tickets
end
def self.get_group_name(tickets)
updated_tickets = []
tickets.each do |t|
t["group_name"] = @zd.groups.find!(:id => t["group_id"])[:name]
updated_tickets << t
end
updated_tickets
end
def self.get_incident_counts(tickets)
print "Getting incidents"
updated_tickets = []
tickets.each do |t|
incidents = @zd.tickets(:path => "tickets/#{t["id"]}/incidents")
seven, thirty, sixty = 0, 0, 0
incidents.to_a.each do |i|
print "."
incident_date = DateTime.parse(i["created_at"].to_s)
now = DateTime.now
# seven += 1 if incident_date > now - 8
# thirty += 1 if incident_date > now - 31
# sixty += 1 if incident_date > now - 91
# if incident_date > now - 8
# seven += 1
# elsif incident_date > now - 38
# thirty += 1
# elsif incident_date > now - 98
# sixty += 1
# end
seven += 1 if incident_date > now - 8
thirty += 1 if incident_date > now - 30
sixty += 1 if incident_date > now - 60
end
t["incident_count"] = incidents.count
t["seven"] = seven
t["thirty"] = thirty
t["sixty"] = sixty
updated_tickets << t
end
print "\n"
tickets
end
def self.get_problem_tickets
print "Getting tickets"
tickets = []
@zd.tickets(:path => "problems").page(1).per_page(100).to_a.each do |t|
print "."
tags = Zendesk.cleanup_tags(t).to_s
ticket = {
"id" => t.id,
"status" => t.status,
"url" => t.url,
"subject" => t.subject,
"created_at" => t.created_at,
"group_id" => t.group_id,
"tags" => tags.gsub(/"|\[|\]/, ''),
# "tags" => tags.to_a.join(","),
"gh_url" => t.custom_fields.select{|field| field["id"] == 22826611 }.first[:value],
"repo" => t.custom_fields.select{|field| field["id"] == 22826611 }.first[:value] ? t.custom_fields.select{|field| field["id"] == 22826611 }.first[:value].match(/Shopify\/([\w-]*)/)[1] : nil
}
tickets << ticket
end
print "\n"
tickets
end
private
def self.cleanup_tags(ticket)
tags = []
ticket.tags.each do |t|
excludes = ["enterprise","escalate","escalating","escalation","first","from_squad:","ft","initial","lvl2","merchant_","msm:","smiley","plan_name","products:products","public","refund_bug","support_","support-","ticketmaster","touched","trigger:","trigger:","yes_about","tier2","tier3"]
tags << t["id"] unless excludes.any? { |ex| t["id"].include?(ex) }
end
tags
end
def self.init
client = ZendeskAPI::Client.new do |config|
config.url = "https://shopify.zendesk.com/api/v2"
config.username = ZD_USERNAME
config.password = ZD_PASSWORD
config.retry = true
# require 'logger'
# config.logger = Logger.new(STDOUT)
end
end
end