@@ -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 }
0 commit comments