
    <YEiT                        d Z ddlZddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% ddl$m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddlm3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZFmGZGmHZH ddlImJZJmKZKmLZL ddlMmNZN ddlOmPZPmQZQmRZRmSZSmSZS ddlAmTZT dd lUmVZVmWZWmXZXmYZY dd!l
mZZZm[Z[mZm\Z\m]Z]m^Z^m_Z_m`Z`maZa dd"lmbZb ddl$m%Z% ddl/m0Z0 dd#lm!Z! dd$lcmdZd dd%lUmeZe dd&lfmgZgmhZhmiZimjZjmkZk ddllZldd	lmZ dd'lmmnZn d(d)lompZp  ej                  er      Zs G d* d+epe j                        Zuy),z
Views for the call APIs.
    N)datetime	timedelta)settings)CountSumMaxAvgQ)	TruncDateExtractHour	TruncHourRound)relativedelta)FileResponseHttp404)timezone)DjangoFilterBackend)permissions)viewsetsstatus)TokenAuthentication)action)api_viewpermission_classesauthentication_classes)SearchFilterOrderingFilter)IsAuthenticatedAllowAny)Response)APIException)Extract)CompanyCompanyBotSettingsDealershipDepartment)CompanyInfoUser)get_bot_namesend_booking_emailsend_booking_sms)Appointment)CallBDCLimitOffsetPagination)Customer)get_company_working_infocheck_sales_time_by_phoneget_rabeeca_working_info)TRANSFER_STATUS	SENTIMENTBotType)
CallFilter)CallCallActivityUserMessageNotificationr8   )CallLimitOffsetPagination)CallDetailSerializerTopRepeatedCallersSerializerDateRangeSerializerCallActivitySerializer)	OuterRefSubqueryr   
FloatFieldFIntegerFieldValueCaseWhen)Coalescer   )UserProfile)ReadCallSerializer)RecordingServiceStorageServiceget_caller_name_by_phone_numberget_twilio_clientNotificationService)process_booking_intent   )UserPerformanceMixinc                      e Zd ZdZeZej                  j                         Z	e
gZeZeeegZeZg dZg dZdgZd Zd Zd Z edd	gd
      d        Z edd	gd      d        Z edd	gd      d        Z edd	gd      d        Z edd	gd      d        Z edd	gd      d        Z  edd	gd      d        Z! edd	gd      d        Z" edd	gd      d        Z# edd	gd      d.d        Z$ edd!gd"e%gg #      d$        Z& edd!gd%e%gg #      d&        Z' edd!gd'e%gg #      d(        Z( ed!gdd)e%gg *      d+        Z) edd!gd,e%gg #      d-        Z*y)/CallViewSetzView for manage call APIs.)from_number	to_number
transcriptsummarycaller_namecall_idtwilio_call_sid)
created_atdurationcost-created_atc                 \   | j                   j                  }|j                  r| j                  }n|j                  r[	 | j                  j                  |j                        }t        j                  j                  |      }||z  j                         }n| j                  j                         S | j                  dk(  r*|j                  t        j                  j                        }|j!                  d      S # t        j                  $ r | j                  j                         cY S w xY w)Ncompany)notifications__recipientlist)bot_typez-id)requestuseris_superuserquerysetactive_companyfilterr5   objectsdistinctr#   DoesNotExistnoner   r3   SERVICE_BOTvalueorder_by)selfrf   qsnotification_callss       A/var/www/html/dp2/backend_v2.1/server/apps/calls/views/summary.pyget_querysetzCallViewSet.get_queryset[   s    ||  B  ,]]))$2E2E)F%)\\%8%8-1 &9 &" --779 ==%%'';;&  ,,22  B {{5!! '' ,}}))++,s   AC; ;-D+*D+c                 D    | j                   dk(  rt        S | j                  S )z(Return the serializer class for request.rc   )r   r:   serializer_class)rr   s    ru   get_serializer_classz CallViewSet.get_serializer_classt   s     ;;& ''$$$    c                 $    |j                          y)zCreate a new call.N)save)rr   
serializers     ru   perform_createzCallViewSet.perform_create{   s    rz   FgetrW   )detailmethodsurl_pathc                 &   | j                  | j                               }|j                  t        d      t        dt	        t
        j                  j                              t        dt	        t
        j                  j                              t        d      t        dd      t        d      t        dd      z
        }|d	   xs d
|d   xs d
|d   xs d
|d   xs d
|d   xs d
|d   xs d
d}t        |t        j                        S )z.Get call summary statistics using DRF filters.idtransfer_statusrj   r\   rT   Trl   )total_callstotal_missed_callstotal_attended_callsaverage_call_timeunique_callersrepeated_callersr   r   r   r   r   r   r   )r   r   r   average_call_time_secondsr   r   rG   )filter_querysetrv   	aggregater   r
   r1   FAILEDrp   
SUCCESSFULr	   r    r   HTTP_200_OK)rr   re   filtered_querysetrW   report_datas        ru   rW   zCallViewSet.summary   s    !001B1B1DE#--d$T!ODZDZD`D`2ab!&tAoF`F`FfFf4g!h!*o >"=1E-RV4WW . 
 #=16Q")*>"?"D1$+,B$C$Hq)01D)E)J%&67<1 '(: ; @q
 F,>,>??rz   zbdc-calls-oldc                    |j                   }d}|j                  r:|j                  j                  d      }|s{t	        ddit
        j                        S |j                  st	        ddit
        j                        S |j                  j                  }|st	        ddit
        j                        S t        j                  j                  |      j                         }|st	        dd	it
        j                        S t        |j                  
      }t        | _        | j#                         j                  |      }|j%                         rM|j&                  j                  d      }|j&                  j                  d      }|r|r|j                  ||      }| j)                  |      }	| j+                  |	      }
g }|
D ]  }	 t,        j                  j                  |j.                  |j0                        }|j2                  }|j6                  |j8                  j;                         ||j.                  |j<                  |j>                  |j@                  |j8                  j;                         |jB                  xs d|jD                  |jF                  xs dd}|jI                  |        | jK                  |      S # t,        j4                  $ r d}Y w xY w)z7Get calls for a specific BDC number from company table.N
bdc_numberr   z#Please provide bdc_number parameterrG   z User must have an active companyz2Your company does not have a BDC number configured)r   z-No company found with the provided BDC numberdata)transfer_number
start_dateend_datecreated_at__gtecreated_at__ltephonera   Unknown )r   call_datetimecustomer_namecustomer_number	sentimenttwilio_call_idschedule_intentionschedule_datetimecall_summaryrY   rV   )&rf   rg   query_paramsr   r    r   HTTP_400_BAD_REQUESTri   r   r#   rk   rj   firstHTTP_404_NOT_FOUNDr<   r,   pagination_classrv   is_validvalidated_datar   paginate_querysetr-   rT   ra   namerm   r   r[   	isoformatr   rZ   booking_intentrW   rY   rV   appendget_paginated_response)rr   re   rf   r   ra   date_serializercalls_querysetr   r   r   
calls_page
calls_datacallcustomerr   	call_datas                   ru   get_bdc_callszCallViewSet.get_bdc_calls   s    ||
 --11,?JC! 557 7 &&@! 557 7 ,,77JR! 557 7 //((J(?EEGI//1 1 .73G3GH <**,33J3O##%(77;;LIJ&5599*EHh!/!6!6$.$, "7 "
 !00@++,=>

D*#++//d6F6FPTP\P\/] (
 gg!%!:!:!<!.#'#3#3!^^"&"6"6&*&9&9%)__%>%>%@ $ 2<<"oo3I i() , **:66% (( * )*s   AKKKzdaily-calls-oldc                    t        |j                        }|j                  d       |j                  }|d   j	                         }|d   j	                         }| j                  | j                               }|j                  }t        j                         }t        |dd      rKt        |j                  dd      r4	 t        j                  j                  |j                  j                        }t        j                  t        j                   |t        j"                  j%                               |      }	t        j                  t        j                   |t'        d	
      z   t        j"                  j%                               |      }
|j)                  |	|
      }|j+                  t-        d|            j/                  d      j+                  t1        d      t1        dd            j3                  d      }t5        ||z
  j6                  d	z         D ci c]  }|t'        |
      z   ddd }}|D ].  }|d   }|d   xs d}|d   xs d}|t9        ||z
  d      d||<   0 t;        |j=                               D cg c]  }d|j?                  d      i||    }}tA        d|itB        jD                        S # t        $ r t        j                         }Y w xY wc c}w c c}w )z
        Return per-day unique and repetitive call counts for a given date range.
        Everything uses Django's timezone utilities.
        r   Traise_exceptionr   r   ri   Nr   rP   daysr   created_at__ltr[   tzinfo)dayr   r   rT   r   )r   r   r   )unique
repetitiver   r   datez%b-%ddaily_callsrG   )#r<   r   r   r   r   r   rv   rf   r   get_default_timezonegetattrri   pytz	Exception
make_awarer   combinemintimer   rj   annotater   valuesr   rq   ranger   maxsortedkeysstrftimer    r   r   )rr   re   r}   	validatedr   r   r   rf   
company_tzstart_dtend_dt_exclusivequeryset_in_range	daily_aggi
days_rangerow	local_dayr   totalr   results                        ru   r   zCallViewSet.daily_calls   s    )g.B.BC
D1--	 |,113
Z(--/ 001B1B1DE||224
4)40WT=P=PR\^b5c=%]]33D4G4G4P4PQ
 &&x'7'7
HLLDUDUDW'XZde#..X	q(998<<;L;L;NO

 .44$+ 5 
 X)LDXEVE]X!$K$]TB   Xe_ 	 Hz177!;<
< **q,JJ< 	 

 CE
I)*/aF&+!E/5SQWYZE[$\Jy!	  joo/0
0 S\\'*>jo>0 	 

 /8J8JKK_  =%::<
=>

s   ?3K K'K,K$#K$ztop-callersc                 T   t        |j                        }|j                  d       |j                  }|d   j	                         }|d   j	                         }|j
                  }t        j                  j                  ||g      }|j                  s)|j                  r|j                  |j                        }n*|j                  st        dg d	t        j                  
      S |j                  d      j                  t!        d            j#                  d      dd }g }	|D ]c  }
|
d   }|
d   }|j                  |      j#                  d      j%                         }|s@t&        j                  j                  |j(                  |j                        j%                         }|r|j*                  nd}t-        |j.                        }|dz   d|dz  dz  dd|dz  d}|j0                  j#                  d      }t3        |d      j4                  }|	j7                  |j8                  |j:                  |j<                  j?                         |||||j@                  |jB                  |jD                  |jF                  |d       f t        |	t        j                  
      S )z+Return top callers based on call frequency.r   Tr   r   r   )created_at__date__ranger`   zNo active company found)messager   rG   rT   r   )
call_countz-call_countN
   r   )rT   r^   r   r   i  :<   02dz-performed_at)many)rY   r   call_date_timer   r   r   r\   rV   partner_call_idr   r   call_activities)$r<   r   r   r   r   rf   r5   rk   rj   rg   ri   r    r   r   r   r   r   rq   r   r-   rT   r   intr\   
activitiesr=   r   r   r   rZ   r[   r   rV   rY   r   rW   )rr   re   r}   r   r   r   rf   base_querysetcall_countsr   callerphone_numberr   most_recent_callr   r   duration_secondsduration_formattedr   activities_datas                       ru   top_callerszCallViewSet.top_callers  s    )g.B.BC
D1--	|,113
Z(--/||++%/$: , 
   T%8%8)009L9L0MM""4 ((* *   /XtX-Xm$Sb* 	 !F!-0L-J,33(  4  h}%eeg   #++22*66 // 3  %'  2:y#&'7'@'@#A (8D(@'ADTW[D[`bCbcfBgghiy|~i~  @C  iD  &E""2"="="F"F"W"8t"T"Y"Y/22&6&F&F&6&A&A&K&K&M%2'3", 2"2"="='7'?'?!1!;!;$4$<$<'6 + "H v'9'9::rz   zhourly-callsc                 F   t        |j                        }|j                  d       |j                  }|d   j	                         }|d   j	                         }| j                  | j                               }|j                  }t        j                         }t        |dd       rKt        |j                  dd       r4	 t        j                  j                  |j                  j                        }t        j                  t        j                   |t        j"                  j%                               |      }	t        j                  t        j                   |t'        d	      z   t        j"                  j%                               |      }
|j)                  |	|

      }|j+                  t-        t/        d|                  j1                  d      j+                  t3        d            j5                  d      }t7        d      D ci c]  }|d }}|D ]  }|d   }|d   xs d}|||<    |j9                         D cg c]  \  }}|dd|d }}}t;        d|it<        j>                        S # t        $ r t        j                         }Y w xY wc c}w c c}}w )Nr   Tr   r   r   ri   r   rP   r   r   r[   r   )
local_hourr  r   )calls   r   r  r   z:00)r   r  hourly_callsrG   ) r<   r   r   r   r   r   rv   rf   r   r   r   ri   r   r   r   r   r   r   r   r   rj   r   r   r   r   r   rq   r   itemsr    r   r   )rr   re   r}   r   r   r   r   rf   r   r   r   r   
hourly_agghhours_ranger   hourr  r   s                      ru   r  zCallViewSet.hourly_calls  sb   (g.B.BC
D1--	|,113
Z(--/ 001B1B1DE||224
4)40WT=P=PR\^b5c=%]]33D4G4G4P4PQ
 &&x'7'7
HLLDUDUDW'XZde#..X	q(998<<;L;L;NO

 .44$+ 5 
 XY|J-W!XXYVL!XE$KX(Xl# 	 &+2Y/Yq!tY/C|$DL%AE %K   +002
2e Sz%62 	 

 09K9KLLE  =%::<
=, 0
s   ?3I4 
JJ4JJzmonthly-statsc                    | j                  | j                               }|j                  }t        j                         }t        |dd      rKt        |j                  dd      r4	 t        j                  j                  |j                  j                        }t        j                         j                  }t        j                  t        |dd      |      }t        j                  t        |dz   dd      |      }|j                  t        dd|      t        dd|      	      j                  dd      j                  t!        d
      t!        d
t#        d            t!        d
t#        d            t!        d
t#        d            t%        t'        d            t)        d            j+                  d      j-                  d      }ddddddddddddd}	g }
|D ]  }t/        |d         }|	j1                  |d|       }|d    xs d}|d!   xs d}|d"   xs d}|d#   xs d}|d$   xs d}|d%   xs d}|d   }t/        |d         }t        j                  t        ||d      |      }|t3        d&      z   }|t5        d'      z
  }|
j7                  ||||||||||d(
        t9        |
t:        j<                  )      S # t        $ r t        j                         }Y Ow xY w)*z\Return monthly call statistics with total calls and missed percentage for current year only.ri   Nr   rP   r[   yearr   month)r  r  r   r   r   r      r\   )r   not_transferred_callsreceived_callsmissed_callsavg_call_timetot_call_time)total_calls__gtJanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)rP   r                    	   r         zMonth r   r  r  r  r  r  )months)microseconds)
r  r  r   r   	tot_callsr  r  r  r  r  rG   )r   rv   rf   r   r   r   ri   r   r   nowr  r   r   r   r"   r   r   r
   r   r	   r   rj   rq   r   r   r   r   r   r    r   r   )rr   re   r   rf   r   current_yearstart_of_yearend_of_yearmonthly_aggmonth_namesr   r   	month_num
month_namer   r  r  r  r  r  r  start_of_monthend_of_months                          ru   monthly_statszCallViewSet.monthly_statsG  s    !001B1B1DE||224
4)40WT=P=PR\^b5c=%]]33D4G4G4P4PQ

  ||~** ++\1a(*
 ))\A%q!,j
 X\6*ElGJG   VFG$X!$K&+D19M&N$T!A2FG"4!0DE#C
O4!*o   VAV&Xg! 	( ZGFx	zz
 CCL)I$fYK4HIJm,1K~.3!L !127aN05AM05AM$'(?$@$EA!v;Ds6{#D%00y!,jN *M,CCL')*CCL MM#,(()> ,"0!.!. / H v'9'9::_  =%::<
=s   %3K K('K(ztransfer-percentagec                 "   t        |j                        }|j                  d       |j                  }|d   }|d   }| j	                  | j                               }|j                  ||      }|j                         }|dk(  r!t        dddddd	t        j                  
      S |j                  d      j                         }	|j                  d      j                         }
|j                  d      j                         }|j                  g d      j                         }t        |	|z  dz  d      }t        |
|z  dz  d      }t        ||z  dz  d      }t        ||z  dz  d      }t        ||||dt        j                  
      S )zRReturn percentages for transferred, not transferred, failed, and unknown statuses.r   Tr   r   r   r   r   g        )transferred_percentagenot_transferred_percentagefailed_percentageunknown_percentager   rG   rP   r   r  )r   rP   r  )transfer_status__ind   )r:  r;  r<  r=  )r<   r   r   r   r   rv   rj   countr    r   r   excluderound)rr   re   r}   r   r   r   r   calls_in_ranger   transferred_countnot_transferred_countfailed_countunknown_countr:  r;  r<  r=  s                    ru   transfer_percentagezCallViewSet.transfer_percentage  s    )g.B.BC
D1--	|,
Z( 001B1B1DE*11&$ 2 

 %**,!*-.1%(&)  ((* * +11!1DJJL . 5 5a 5 H N N P%,,Q,?EEG&..9.MSSU!&(9K(G3'NPQ!R%*,AK,OSV+VXY%Z"!<+#="DaH"MK$?3#FJ&<*D!2"4	

 $$& 	&rz   zprocess-booking-intentc                 R    t        d       t        ddit        j                        S )z"Process booking intent for a call.zGprocess_booking_intent function removed from api process-booking-intentr   z4Booking intent processed converted into trigger taskrG   )printr    r   r   rr   re   s     ru   rO   z"CallViewSet.process_booking_intent  s'     	WX$Z[djdvdvwwrz   readc                    t        |j                  d|i      }|j                         s%t        |j                  t
        j                        S |j                  d   }|j                  }|j                  rt        j                  j                  |      }t        j                         }||_        ||_        t"        j                  j%                  ||j                  d|       |j'                          t        dd	it
        j(                        S t        j                  j                  ||j*                  
      }t-        j                  |j*                  j                        }t        j                         }|j/                  |      }	||_        |	|_        t"        j                  j%                  ||j                  d|	       |j'                          t        ddit
        j(                        S )z3Process booking intent for a call and mark as read.re   )r   contextrG   r   )r   READ)r   rf   r   performed_atr   z%Call marked as read from super admin.)r   ra   zCall marked as read.)rI   r   r   r    errorsr   r   r   rf   rg   r5   rk   r   r   r.  read_byread_atr6   creater|   r   ri   r   
astimezone)
rr   re   r}   r   rf   r   current_timecompany_timezonecurrent_time_utccurrent_time_companys
             ru   	read_callzCallViewSet.read_call  s    (W-A-AIW^K_`
""$J--f6Q6QRR&&t,||<<##r#*D#<<>LDL'DL  ''\\)	 (  IIKA((* * ||2t/B/BC==)<)<)E)EF#<<>/::;KL+##-	 	$ 	
 			,
$$& 	&rz   Tzget-recordingNc                    | j                         }t        t                     }t               }|j	                  |      }|j                  |      \  }}t        j                  j                  |      rt        d|j                  ||      i      S |j                  |j                        }	|j                  |	j                        }
|j                  ||
       t        d|j                  ||      i      S )Nrecording_url)
get_objectrJ   rM   rK   build_call_audio_filenamecall_recording_local_pathospathexistsr    call_recording_public_urlget_latest_call_recordingrZ   downloadsidsave_call_recording_stream)rr   re   pkr   recording_servicestorage_servicefilenamerelative_pathfilepath	recordingresponses              ru   download_recordingzCallViewSet.download_recording  s     ,->-@A(*"<<TB"1"K"KH"Ux77>>(#_o.W.WX_an.opqq%??@T@TU	$--imm<228XF/*S*ST[]j*klmmrz   postzrecord-offtime-message)r   r   r   r   r   c                    |j                   }|j                  di       }|j                  d      }|j                  d      }t        j                  d       t        j                  d|        |j                  di       }|j                  d      }|j                  d      }|j                  d	      }	|j                  d
      }
t        j                  dt	        |              t        j                  d|        t        j                  d|        t        j                  d|	        t        j                  d|
        t        j                  d       t
        j                  j                  |      j                         }|r|j                  nd}|st        ddit        j                        S |j                  j                  |d      j                         }|st        ddit        j                        S t        j                  d       t        j                  j                  ||
|	|d|	        t        j                  d       t        j                  d       t        ddit        j                         S ) !Handle incoming webhook requests.r   rT   rU   zn=============================== Record Offtime Message request.data starts ===================================Webhook Data: args
advisor_idadvisor_namer   customer_noteztype of advisor_id: zadvisor_id: zadvisor_name: customer_name: zcustomer_note: `=============================== Getting Company Bot Settings ===================================r   Nr   Company not foundrG   T)r   	is_activezUser not foundzY=============================== Creating User Message ===================================zOfftime Message from )	recipientbodyr   r   subjectze=============================== User Message created successfully ===================================z]=============================== Recording Offtime Message ===================================r   z%Offtime message recorded successfully)r   r   loggerinfotyper$   rk   rj   r   ra   r    r   r   usersr7   rT  r   )rr   re   webhook_datar   customer_phonecompany_phoneru  rv  rw  r   rx  companyBotSettingsra   rf   s                 ru   record_offtime_messagez"CallViewSet.record_offtime_message#  s3    || $$VR0	"}5!k2  E  	Fn\N34+XXl+
xx/11*4
+;*<=>l:,/0n\N34om_56om_56 	vw/77>>M>Z``b0B$,,-//1 1 }}##zT#BHHJ*//1 1 	op""'*+M?; 	# 	
 	{|st$KLU[UgUghhrz   zsend-appointment-emailc                 $   |j                   }|j                  di       }|j                  d      }|j                  d      }t        j                  d       t        j                  d|        |j                  di       }|j                  d      }|j                  d      }|j                  d	      }	t        j                  d
|        t        j                  d|        t        j                  d|	        t        j                  d       t        j
                  j                  |      j                         }
|
r|
j                  nd}|st        ddit        j                        S t        j                  d       |j                  }|st        ddit        j                        S t        j                  d       t        ||||	|       t        ||||	|       t        j                  d       t        ddit        j                        S )rs  r   rT   rU   zn=============================== Send Appointment Email request.data starts ===================================rt  ru  booking_datetimer   servicezbooking_datetime: ry  z	service: rz  r{  Nr   r|  rG   zV=============================== Getting BDC number ===================================zBDC number not foundzY=============================== Sending Email and SMS ===================================zc=============================== Email and SMS sent successfully ===================================r   zEmail and SMS sent successfully)r   r   r  r  r$   rk   rj   r   ra   r    r   r   r   r)   r*   r   )rr   re   r  r   r  r  ru  r  r   r  r  ra   r   s                ru   send_appointment_emailz"CallViewSet.send_appointment_email^  s    || $$VR0	"}5!k2  E  	Fn\N34+88$671((9%()9(:;<om_56iy)* 	vw/77>>M>Z``b0B$,,-//1 1 	lm''
0//1 1 	op:}6FQ_`]4Dg~^yz$EFvOaOabbrz   zlog-call-webhookc           	         |j                   }|j                  d      }|dk(  rr|j                  di       }|j                  d      }|j                  d      }|j                  d      dk(  }t        j                  d       t        j                  d	|        t        j                  d
|        t        j                  d|        t        j                  d|        t        j                  d       t        j
                  j                  |      j                         }|r|j                  nd}	d}
|j                  j                         dk(  rt        j                  j                  }
no|j                  j                         dk(  rt        j                  j                  }
n7|j                  j                         dk(  rt        j                  j                  }
d}|j                  dg       }|D ]  }|j                  d      dk(  s|j                  d      dk(  s-|j                  dd      }t!        j"                  |      }|j                  d      }t        j                  d|j                  d               t        j                  d|        d}|r>t$        j
                  j                  |      j                         }|r|j&                  nd}d}|
t        j                  j                  k(  rM|rKt(        j
                  j                  |      j+                  d      j                         }|r|j,                  }t.        j0                  j                  }|r|rt.        j2                  j                  }n|r|st.        j4                  j                  }|j                  di       j                  dd      }t7        |t8              r|r|d    }t;        |      j=                  d!      }t>        j@                  j                  }|j                         d"k(  rt>        jB                  j                  }n-|j                         d#k(  rt>        jD                  j                  }|j                  d$i       j                  d%      }|j                  di       }|j                  d&i       }|j                  d'      }|j                  d(      }t7        |t:              r |j=                         r|j=                         nd}t        j                  d)|        t        j                  d*|        tF        j
                  jI                  |j                  d+      i d|d|d,|d-|	d|d.|d(|d/|d0|d1|
d2|j                  d3      d4|j                  d4      d5|d6|j                  di       j                  d7      d8|j                  d9i       j                  d:      xs d d;|j                  d9i       j                  d<      xs d d%|=      \  }}tJ        j
                  j                  |>      j                         }|r||_&        |jO                          tQ        jR                         |jT                  d?} |r|j=                         | d<   tV        j
                  jY                  ||	| @      \  }!}"|"r#t[        |      |!_.        |!jO                  dAgB       |r]|[t_        j`                  |jT                  dCdDdEF       |t.        j4                  j                  k(  rtc        jd                  |||	||G       |rdHndI}#t        j                  dJ| dK|jf                          ti        dJ|# dL|jf                  |#dMtj        jl                  N      S t        j                  dO| dP       ti        dO| dP||dQtj        jl                  N      S )Rrs  eventcall_analyzedr   rT   rU   disconnection_reasoncall_transferz'=-=-=-=-=-=-=-=Call Data=-=-=-=-=-=-=-=zCustomer Phone: zCompany Phone: zIs Call Transferred: zCall Data: r{  Nhazelmayarebeccatranscript_with_tool_callsroletool_call_invocationr   transfer_call	argumentsz{}numberzTransfer Destination Number 1: zTransfer Destination Number: 
dealershipcall_analysisuser_sentimentr   r   'positiveneutraltelephony_identifierrZ   custom_analysis_datar   call_time_categoryzCustomer Name: zClean Customer Phone: rY   rX   ra   r   transfer_userr   rd   r   call_statusrV   r   rW   r   r\   	call_costtotal_duration_secondsr]   combined_cost)rY   defaults)rZ   )last_call_atlast_call_id)r   ra   r  name_extracted)update_fieldsT)rY   use_speaker   )kwargs	countdown)r   rf   ra   r   r  createdupdatedzCall z successfully: z successfully)r   rY   r   rG   zCall webhook for z received successfully)r   r  r   )7r   r   r  r  r$   rk   rj   r   ra   bot_namelowerr3   	SALES_BOTrp   ro   DEALERSHIP_GROUP_BOTjsonloadsrH   rf   r%   select_relatedr  r1   NOT_TRANSFERREDr   r   
isinstancetuplestrstripr2   NEGATIVEPOSITIVENEUTRALr5   update_or_creater+   r   r|   r   r.  r   r-   get_or_createrL   r  rO   apply_asyncrN   send_missed_call_notificationrY   r    r   r   )$rr   re   r  r  r   r  r  is_call_transferredr  ra   botTypetransfer_destination_numberr  itemr  	args_datarf   user_profiler  dealership_departmentr   sentiment_strr   rZ   r  custom_analysisr   r  clean_customer_namer   call_createdappointmentcustomer_defaultsr   r  r   s$                                       ru   log_call_webhookzCallViewSet.log_call_webhook  sn    ||  )O#$((4I&]]=9N%MM+6M"+--0F"G?"ZKKABKK*>*:;<KK/-9:KK/0C/DEFKK+i[12KKAB!3!;!;!B!BP]!B!^!d!d!f4F(00DGG!**002g=!++11#,,224>!--33#,,224	A!66<<*.')27SUW)X&288F#'==$((6BRVeBe $d ;I $

9 5I2;--2I/KK"A)--PXBYAZ [\ 3 KK78S7TUVD+*2299Gb9ciik,8|((dJ'66<<<.,@,H,H,O,O%@ -P -$n\2557 * -%:%E%E
-==CCO*/B"1"<"<"B"B,5H"1"8"8">">%MM/2>BBCSUWXM-/M -a 0.44S9M!**00I""$
2%..44	$$&)3%--33	'mm,BBGKKL]^O%MM/2>M+//0FKO+//@M!0!4!45I!J)3M3)GML_L_La##%gk   KK/-9:KK01D0EFG!%!>!>!i0!> "#6 w	
 !* &'B )*< $T &  immM: !)--"=   y}}_bAEEnU 	k2 > B BC[ \ a`a  IMM+r:>>OTST!" &# "? "D,2 &--44_4U[[]K#'   " !) $!
 #,9,?,?,A!&) ( 0 0 > >$* !? !Hg *I.*Y'-=,>? ; G&22'+wwtD 
 #o&<&<&B&BB (EE!! '&9'5 #/YIFKK%~_T\\NKL"6(-8<<  ((	* * KK+E72HIJ.ug5KL$ ((	* *rz   z!inbound-dynamic-variables-webhook)r   r   r   r   r   c                    d}|j                   j                  d      dk(  r,d|j                   v r|j                   d   j                  d      }t        j                  d|        t	        |      }|st        ddit        j                        S d}d}|j                         d	k(  rMt        |      }|d
   }|d   }|j                         D 	
ci c]  \  }	}
|	t        |
       }}	}
|rd}n|du rd}n|j                         dk(  rMt        |      }|d
   }|d   }|rd}n|du rd}|j                         D 	
ci c]  \  }	}
|	t        |
       }}	}
nJ|j                         dk(  r7t        |      }|j                         D 	
ci c]  \  }	}
|	t        |
       }}	}
|(d|i}|||d<   t        d|it        j                        S t        ddit        j                        S c c}
}	w c c}
}	w c c}
}	w )rs  Nr  call_inboundrU   zExtracted company_number: r   z&This bot not configured in our system.rG   r  
is_holidayis_office_hours agent_f72f27787dfcdcd7dc94ed136aF agent_9969e3fc1fd45a66a76ef1913br  r  dynamic_variablesoverride_agent_id)r   r   r  r  r(   r    r   r   r  r/   r  r  r.   r0   r   )rr   re   rU   r  overrideAgentIdr  
sales_infor  r  kvcompany_inforabeeca_infocall_inbound_payloads                 ru   !inbound_dynamic_variables_webhookz-CallViewSet.inbound_dynamic_variables_webhook;  s.    	<<G$6>W\\;Y^488EI0<=	*X'OPY_YtYtuu  >>w&
 39=J#L1J():;O7A7G7G7I J7Itq!CF7I J"D E)"D^^'3I>L%l3J*+<=O"D E)"D 8D7I7I7K L7Ktq!CF7K L^^*3I>L7C7I7I7K L7Ktq!CF7K L (#%6$  *<K$%89 4((* * #KLU[UpUpqqW !K" !M !Ms   G$9G*G0zlog-transfer-call-webhookc                    t         j                  d|j                          t         j                  dt        |j                                t         j                  d|j
                          t        ddit        j                        S )rs  z+Log Transfer Call Webhook received - Data: z%Log Transfer Call Webhook - Headers: z$Log Transfer Call Webhook - Method: r   zWebhook received successfullyrG   )	r  r  r   dictheadersmethodr    r   r   rK  s     ru   log_transfer_call_webhookz%CallViewSet.log_transfer_call_webhook  sl     	A',,PQ;D<Q;RST:7>>:JKL$CDVM_M_``rz   )N)+__name__
__module____qualname____doc__r:   rx   r5   rk   allrh   r   r   r9   r   r   r   r   filter_backendsr4   filterset_classsearch_fieldsordering_fieldsorderingrv   ry   r~   r   rW   r   r   r  r  r8  rH  rO   rZ  rp  r   r  r  r  r  r   rz   ru   rS   rS   G   s   $+||!H)*0*L.IO OM 9OH"2% 55'I>@ ?@0 55'ODF7 EF7P 55'4EFCL GCLX 55'MBB; CB;H 55'NC1M D1Mf 55'ODX; EX;t 55'4IJ)& K)&V 55'4LMx Nx 55'F;2& <2&h 4%?Cn Dn( 5H- (z#%	2i2ij 5H- (z#%	+c+cZ 5H' (z#%	b*b*H 4$:!BrBrH 5H0 (z#%	aarz   rS   )vr  r  logging	mimetypesr`  requestsr   r   django.confr   django.db.modelsr   r   r   r	   r
   django.db.models.functionsr   r   r   r   dateutil.relativedeltar   django.httpr   r   django.utilsr   django_filters.rest_frameworkr   rest_frameworkr   r   r   rest_framework.authenticationr   rest_framework.decoratorsr   r   r   r   rest_framework.filtersr   r   rest_framework.permissionsr   r   rest_framework.responser    rest_framework.exceptionsr!   r"   apps.companies.modelsr#   r$   r%   apps.core.modelsr&   r'   apps.calls.utilsr(   r)   r*   apps.appointments.modelsr+   apps.calls.paginationr,   apps.customers.modelsr-   apps.companies.utilsr.   r/   r0   apps.calls.constantsr1   r2   r3   apps.calls.filtersr4   apps.calls.modelsr5   r6   r7   r8   r9   apps.calls.serializersr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   apps.userprofile.modelsrH   rI   apps.calls.servicesrJ   rK   rL   rM   rN   r   apps.calls.tasksrO   user_performancerQ   	getLoggerr  r  ModelViewSetrS   r  rz   ru   <module>r     s       	  (   4 4 O O 0 - ! = & + = , Z Z ? @ , 2 . S S . O O 0 > * n n D D ) Y Y ;    0 , , ! / 5   ! 3 2 
		8	$Ka&(=(= Karz   