Module: JiraIssue::SLATracker

Included in:
JiraIssue
Defined in:
lib/jira_reporting/sla_tracker.rb

Instance Method Summary collapse

Instance Method Details

#approaching_sla_due_time?Boolean

Returns:

  • (Boolean)


90
91
92
93
# File 'lib/jira_reporting/sla_tracker.rb', line 90

def approaching_sla_due_time?
  return false if sla_due_time.nil? || closed?
  sla_remaining_time < sla_warning_time
end

#over_sla?Boolean

Returns:

  • (Boolean)


95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/jira_reporting/sla_tracker.rb', line 95

def over_sla?
  case
  when over_sla == API_OVER_SLA_FIELD_NO
    false
  when sla_due_time.nil?
    false
  when closed? && sla_closed_at > sla_due_time
    true
  when open? && Time.now > sla_due_time
    true
  end
end

#resolution_baseObject



159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/jira_reporting/sla_tracker.rb', line 159

def resolution_base
  if requester_review
    requester_review
  elsif resolved
    resolved
  elsif cant_reproduce
    cant_reproduce
  elsif not_accepted
    not_accepted
  else
    # not resolved
    nil
  end
end

#set_over_sla!(over = nil) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/jira_reporting/sla_tracker.rb', line 11

def set_over_sla!(over = nil)
  over ||= over_sla?
  return if over.nil? || over == false
  jira_issue = jiralicious_issue
  jira_issue.fields.set_id(OVER_SLA_FIELD, OVER_SLA_FIELD_YES)
  jira_issue.save!
end

#set_sla_closed_at!(sla_closed_at = nil) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/jira_reporting/sla_tracker.rb', line 27

def set_sla_closed_at!(sla_closed_at = nil)
  sla_closed_at ||= closed_at
  return if sla_closed_at.nil? || open?
  jira_issue = jiralicious_issue
  jira_issue.fields.set(SLA_CLOSED_AT_FIELD, sla_closed_at.iso8601)
  jira_issue.save!
end

#set_sla_due_time!(due_time = nil) ⇒ Object



3
4
5
6
7
8
9
# File 'lib/jira_reporting/sla_tracker.rb', line 3

def set_sla_due_time!(due_time = nil)
  due_time ||= sla_target
  return unless due_time
  jira_issue = jiralicious_issue
  jira_issue.fields.set(SLA_DUE_TIME_FIELD, due_time.iso8601)
  jira_issue.save!
end

#set_sla_due_warning!(almost_over_sla = nil) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/jira_reporting/sla_tracker.rb', line 19

def set_sla_due_warning!(almost_over_sla = nil)
  almost_over_sla ||= approaching_sla_due_time?
  return if almost_over_sla.nil? || almost_over_sla == false
  jira_issue = jiralicious_issue
  jira_issue.fields.set_id(SLA_DUE_WARNING_FIELD, SLA_DUE_WARNING_FIELD_SET)
  jira_issue.save!
end

#set_total_time_over_sla!(time_over_sla = nil) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/jira_reporting/sla_tracker.rb', line 35

def set_total_time_over_sla!(time_over_sla = nil)
  time_over_sla ||= sum_total_time_over_sla
  return unless over_sla == API_OVER_SLA_FIELD_YES || closed? || time_over_sla.present?
  jira_issue = jiralicious_issue
  jira_issue.fields.set(TOTAL_TIME_OVER_SLA_FIELD, time_over_sla)
  jira_issue.save!
end

#sla_baseObject



43
44
45
# File 'lib/jira_reporting/sla_tracker.rb', line 43

def sla_base
  created_at
end

#sla_diff(now = Time.now) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/jira_reporting/sla_tracker.rb', line 116

def sla_diff(now = Time.now)
  t = sla_target
  b = resolution_base
  if t && b
    b - t
  elsif t
    now - t
  else
    0
  end
end

#sla_remaining_timeObject



82
83
84
# File 'lib/jira_reporting/sla_tracker.rb', line 82

def sla_remaining_time
  sla_due_time - Time.now
end

#sla_targetObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/jira_reporting/sla_tracker.rb', line 47

def sla_target
  case priority
  when :p1
    sla_base + 2.hours
  when :p2
    sla_base + 24.hours
  when :p3
    if sla_base <= FIVE_P_DATE
      5.business_days.after(sla_base)
    else
      3.business_days.after(sla_base)
    end
  when :p4
    if sla_base <= FIVE_P_DATE
      nil
    else
      5.business_days.after(sla_base).change(:hour => BusinessTime::Config.end_of_workday.hour)
    end
  else
    nil
  end
end

#sla_time_ratio(from = Time.now) ⇒ Object



70
71
72
73
74
75
76
# File 'lib/jira_reporting/sla_tracker.rb', line 70

def sla_time_ratio(from = Time.now)
  return 0 if priority == :p5
  from = closed_at if closed?
  available_time = sla_target - sla_base
  used_time      = from - sla_base
  used_time.to_f / available_time
end

#sla_total_available_timeObject



78
79
80
# File 'lib/jira_reporting/sla_tracker.rb', line 78

def sla_total_available_time
  sla_due_time - sla_base
end

#sla_warning_timeObject



86
87
88
# File 'lib/jira_reporting/sla_tracker.rb', line 86

def sla_warning_time
  sla_total_available_time*0.20
end

#sum_total_time_over_slaObject

> difference in hours



108
109
110
111
112
113
114
# File 'lib/jira_reporting/sla_tracker.rb', line 108

def sum_total_time_over_sla # => difference in hours
  if over_sla == API_OVER_SLA_FIELD_YES
    ((sla_closed_at - sla_due_time) / 60) / 60
  else
    0
  end
end

#time_to_finish_workObject



144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/jira_reporting/sla_tracker.rb', line 144

def time_to_finish_work
  if in_progress
    if pr_review
      pr_review - in_progress
    elsif requester_review
      requester_review - in_progress
    end
  else
    nil
  #elsif resolved
  #  # wtf?
  #  resolved - created_at
  end
end

#time_to_start_workObject



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/jira_reporting/sla_tracker.rb', line 128

def time_to_start_work
  if verified
    if in_progress
      in_progress - verified
    else
      Time.now - verified
    end
  elsif triaged && in_progress
    in_progress - triaged
  elsif in_progress
    in_progress - created
  else
    nil
  end
end

#total_time_to_resolutionObject



174
175
176
177
178
179
180
181
# File 'lib/jira_reporting/sla_tracker.rb', line 174

def total_time_to_resolution
  b = resolution_base
  if b
    resolution_base - created_at
  else
    nil
  end
end