
    /h.                        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 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,m-Z- ddlm.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZFmGZGmHZH ddlImJZJ ddlKmLZLmMZM dd l>mNZN dd!lOmPZPmQZQmRZR dd"lSmTZT dd#lUmVZV d$d%lWmXZX dd&lOmYZY ddlZZZddlmZ  ej                  e\      Z] G d' d(ej                        Z_y))z
Views for the call APIs.
    N)datetime	timedelta)settings)CountSumMaxAvgQ)	TruncDateExtractHour	TruncHour)FileResponseHttp404)timezone)DjangoFilterBackend)permissions)viewsetsstatus)TokenAuthentication)action)api_viewpermission_classesauthentication_classes)SearchFilterOrderingFilter)IsAuthenticatedAllowAny)Response)Extract)get_caller_name_by_phone_numberget_twilio_client)CompanyCompanyBotSettings)CompanyInfoUser)process_booking_intent)get_bot_name)Appointment   )CallBDCLimitOffsetPagination)Customer)get_company_working_infocheck_sales_time_by_phone)TRANSFER_STATUS	SENTIMENTBotType)
CallFilter)CallCallActivity)CallLimitOffsetPagination)CallDetailSerializerTopRepeatedCallersSerializerDateRangeSerializer)RecordingService)StorageService   )UserProfile)ReadCallSerializerc                      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y)CurrentUserCallViewSetzView for manage call APIs.)from_number	to_number
transcriptsummary)
created_atdurationcostz-created_atc                 <   | j                   j                  }|j                  rR	 t        j                  j                  |j                  j                        }| j                  j                  |      }n| j                  j                         S |j                  |      }| j                  dk(  r*|j                  t        j                  j                        }|j                  d      S # t        j                  $ r | j                  j                         cY S w xY w)N)phone)company)transfer_userlist)bot_typez-id)requestuseractive_companyr"   objectsgetrG   querysetfilterDoesNotExistnoner   r0   SERVICE_BOTvalueorder_by)selfrM   company_infoqss       F/var/www/html/dp2/backend_v2.1/server/apps/calls/current_user_views.pyget_querysetz#CurrentUserCallViewSet.get_querysetA   s    ||  ,&229L9L9R9R2S]])),)? ==%%''YYTY*;;& G$7$7$=$=>B{{5!! '' ,}}))++,s   AC+ +-DDc                 D    | j                   dk(  rt        S | j                  S )z(Return the serializer class for request.rJ   )r   r5   serializer_class)rX   s    r[   get_serializer_classz+CurrentUserCallViewSet.get_serializer_classS   s     ;;& ''$$$    c                 $    |j                          y)zCreate a new call.N)save)rX   
serializers     r[   perform_createz%CurrentUserCallViewSet.perform_createZ   s    r`   FrP   rB   )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rR   rD   r?   Tdistinct)total_callstotal_missed_callstotal_attended_callsaverage_call_timeunique_callersrepeated_callersro   r   rp   rq   rr   rs   rt   )ro   rp   rq   average_call_time_secondsrs   rt   r   )filter_querysetr\   	aggregater   r
   r.   FAILEDrV   
SUCCESSFULr	   r   r   HTTP_200_OK)rX   rL   filtered_querysetrB   report_datas        r[   rB   zCurrentUserCallViewSet.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,>,>??r`   zdaily-callsc                    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.
        dataTraise_exception
start_dateend_daterN   Nr   r)   )dayscreated_at__gtecreated_at__ltrC   tzinfo)dayr   ri   r?   rm   )ro   rs   r   )unique
repetitivers   ro   datez%b-%ddaily_callsrv   )#r7   query_paramsis_validvalidated_datar   rw   r\   rM   r   get_default_timezonegetattrrN   pytz	Exception
make_awarer   combinemintimer   rR   annotater   valuesr   rW   ranger   maxsortedkeysstrftimer   r   r{   )rX   rL   rc   	validatedr   r   r|   rM   
company_tzstart_dtend_dt_exclusivequeryset_in_range	daily_aggi
days_rangerow	local_dayr   totalr   results                        r[   r   z"CurrentUserCallViewSet.daily_callsx   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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                  ||      }|j                  t        dd|      t        dd	|      
      j!                  dd	      j                  t#        d      t#        dt%        d                  j                  d      j'                  d	      }	ddddddddddddd}
g }|	D ]g  }t)        |d	         }|
j+                  |d|       }|d   xs d}|d    xs d}d!}|dkD  rt-        ||z  d"z         d#}|j/                  |||d$       i t1        |t2        j4                  %      S # t        $ r t        j                         }Y w xY w)&z\Return monthly call statistics with total calls and missed percentage for current year only.rN   Nr   r)   r   rC   yearr   month)r   r   ri   r   rj   rl   )ro   missed_calls)total_calls__gtJanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)r)   r:                     	   
         zMonth ro   r   z0%d   %)r   callsmissedrv   )rw   r\   rM   r   r   r   rN   r   r   nowr   r   r   rR   r   r   r   r   r
   rW   intrP   roundappendr   r   r{   )rX   rL   r|   rM   r   current_yearstart_of_yearend_of_yearcurrent_year_querysetmonthly_aggmonth_namesr   r   	month_num
month_namero   r   missed_percentages                     r[   monthly_statsz$CurrentUserCallViewSet.monthly_stats   s\    !001B1B1DE||224
4)40WT=P=PR\^b5c=%]]33D4G4G4P4PQ

  ||~** ++\1a(*
 ))\A%q!,j
 !2 8 8)& !9 !
 "X\6*ElGJG   VFG$X!$K"4!0DE   VAV&Xg 	  ZGFx	zz
 CCL)I$fYK4HIJm,1K~.3!L $Q',l[.HC-O'P&QQR$S!MM#$+    v'9'9::o  =%::<
=s   %3H/ /II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   created_at__lter   g        )transferred_percentagenot_transferred_percentagefailed_percentageunknown_percentagero   rv   r)   rj   r:   )r   r)   r:   )transfer_status__inr   )r   r   r   r   )r7   r   r   r   rw   r\   rR   countr   r   r{   excluder   )rX   rL   rc   r   r   r   r|   calls_in_rangero   transferred_countnot_transferred_countfailed_countunknown_countr   r   r   r   s                    r[   transfer_percentagez*CurrentUserCallViewSet.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	

 $$& 	&r`   N)__name__
__module____qualname____doc__r5   r^   r2   rO   allrQ   r   r   r4   pagination_classr   r   r   filter_backendsr1   filterset_classsearch_fieldsordering_fieldsorderingr\   r_   rd   r   rB   r   r   r    r`   r[   r>   r>   5   s    $+||!H)*0*L.IO OIM8OH"$% 55'I>@ ?@2 55'MBCL CCLL 55'OD@; E@;D 55'4IJ)& K)&r`   r>   )`r   jsonlogging	mimetypesosrequestsr   r   django.confr   django.db.modelsr   r   r   r	   r
   django.db.models.functionsr   r   r   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   r   apps.calls.services.twilior    r!   apps.companies.modelsr"   r#   apps.core.modelsr$   r%   apps.calls.crons.callsr&   apps.calls.utilsr'   apps.appointments.modelsr(   
paginationr*   apps.customers.modelsr+   apps.companies.utilsr,   r-   	constantsr.   r/   r0   filtersr1   modelsr2   r3   r4   serializersr5   r6   r7   services.recording_servicer8   services.storage_servicer9   userprofile.modelsr;   r<   r   	getLoggerr   loggerModelViewSetr>   r   r`   r[   <module>r     s       	  (   4 4 H H - ! = & + = , Z Z ? @ , . Y = . 9 ) 0 4 * T : :  & 1  9 4 , +  !			8	$w&X22 w&r`   