TomKaniuch
11/6/2017 - 5:41 PM

Problem ticket report

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