Skip to content

Commit 74fe8d4

Browse files
authored
Merge pull request #228 from DefactoSoftware/AlbertClosingTime
fix correctly calculating open time
2 parents cff7a21 + be15610 commit 74fe8d4

File tree

2 files changed

+51
-24
lines changed

2 files changed

+51
-24
lines changed

lib/intercom_stats/intercom/worker.ex

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -113,23 +113,16 @@ defmodule IntercomStats.Intercom.Worker do
113113

114114
defp get_conversation_specific_properties_in_task(item) do
115115
conversation = request_conversation(item)
116-
response_times = calculate_response_times(conversation)
116+
response_times = response_times(conversation)
117117
closed_timestamp = determine_closed_timestamp(conversation)
118-
snooze_time = determine_snooze_time(conversation)
118+
closing_time = closing_time(conversation)
119119
{total_response_time, average_response_time} = average_response_time(response_times)
120120

121121
item
122122
|> Map.put("company_name", retrieve_company_name(conversation))
123123
|> Map.put("tags", retrieve_tags_for_conversation(conversation))
124124
|> Map.put("time_to_first_response", first_response_time(response_times))
125-
|> Map.put(
126-
"closing_time",
127-
calculate_closing_time(
128-
conversation,
129-
closed_timestamp,
130-
snooze_time
131-
)
132-
)
125+
|> Map.put("closing_time", closing_time)
133126
|> Map.put("average_response_time", average_response_time)
134127
|> Map.put("total_response_time", total_response_time)
135128
|> Map.put("closed_timestamp", closed_timestamp)
@@ -171,27 +164,51 @@ defmodule IntercomStats.Intercom.Worker do
171164

172165
defp average_response_time(_), do: {nil, nil}
173166

174-
defp calculate_closing_time(%{"created_at" => created}, close_timestamp, snooze_time) do
175-
close_timestamp - created - snooze_time
176-
end
177-
178-
defp determine_snooze_time(%{"conversation_parts" => %{"conversation_parts" => parts}}) do
167+
defp closing_time(%{
168+
"conversation_parts" => %{"conversation_parts" => parts},
169+
"created_at" => created_at
170+
}) do
179171
{result, _} =
180172
Enum.flat_map_reduce(parts, %{}, fn i, acc ->
181-
case acc["part_type"] do
182-
"snoozed" -> {[calculate_snooze_time(i, acc)], i}
183-
_ -> {[], i}
173+
174+
cond do
175+
closed?(i) and acc == %{} ->
176+
{[i["created_at"] - created_at], i}
177+
178+
closed?(i) and open?(acc) ->
179+
{[open_time(i, acc)], i}
180+
181+
open?(i) and closed?(acc) ->
182+
{[], i}
183+
184+
true ->
185+
{[], acc}
184186
end
185187
end)
186188

187189
Enum.sum(result)
188190
end
189191

190-
defp calculate_snooze_time(part, snoozed_part) do
191-
part["created_at"] - snoozed_part["created_at"]
192+
defp open?(part) do
193+
part["part_type"] in [
194+
"comment",
195+
"note_and_reopen",
196+
"open",
197+
"unsnoozed",
198+
"assign_and_unsnooze",
199+
"timer_unsnooze"
200+
]
201+
end
202+
203+
defp closed?(part) do
204+
part["part_type"] in ["close", "snoozed"]
205+
end
206+
207+
defp open_time(closed_part, open_part) do
208+
closed_part["created_at"] - open_part["created_at"]
192209
end
193210

194-
defp calculate_response_times(%{
211+
defp response_times(%{
195212
"created_at" => created_at,
196213
"conversation_message" => %{"author" => author, "body" => body},
197214
"conversation_parts" => %{"conversation_parts" => unfiltered_parts}

test/support/intercom_api_adapter.ex

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ defmodule IntercomStats.IntercomAPIAdapter do
352352
end
353353

354354
defp conversation4 do
355-
{:ok,
355+
{:ok,
356356
%{
357357
status_code: 200,
358358
body: """
@@ -939,6 +939,17 @@ defmodule IntercomStats.IntercomAPIAdapter do
939939
"id": "100"
940940
}
941941
},
942+
{ "type": "conversation_part",
943+
"id": "101",
944+
"part_type": "note",
945+
"body": "reply",
946+
"created_at": 1500020003,
947+
"updated_at": 1500020003,
948+
"author": {
949+
"type": "admin",
950+
"id": "100"
951+
}
952+
},
942953
{
943954
"type": "conversation_part",
944955
"id": "93",
@@ -954,7 +965,7 @@ defmodule IntercomStats.IntercomAPIAdapter do
954965
{
955966
"type": "conversation_part",
956967
"id": "94",
957-
"part_type": "snoozed",
968+
"part_type": "close",
958969
"body": null,
959970
"created_at": 1500020008,
960971
"updated_at": 1500020008,
@@ -1010,5 +1021,4 @@ defmodule IntercomStats.IntercomAPIAdapter do
10101021
"""
10111022
}}
10121023
end
1013-
10141024
end

0 commit comments

Comments
 (0)