
    Ģ-i*                     F   d dl Z d dl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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$ d dl%m&Z&m'Z' d dl
mZ  e jP                  e)      Z* G d dejV                        Z,y)    N)datetime	timedelta)CountAvgQ)	TruncDateExtract)timezone)DjangoFilterBackend)viewsetsstatus)action)SearchFilterOrderingFilter)IsAuthenticated)Response)Company)TRANSFER_STATUSBotType)
CallFilter)Call)CallLimitOffsetPagination)CallDetailSerializerDateRangeSerializerc                      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getr%   querysetfilterDoesNotExistnoner   r   SERVICE_BOTvalueorder_by)selfr+   company_infoqss       F/var/www/html/dp2/backend_v2.1/server/apps/calls/views/current_user.pyget_querysetz#CurrentUserCallViewSet.get_queryset'   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.r(   )r   r   serializer_class)r6   s    r9   get_serializer_classz+CurrentUserCallViewSet.get_serializer_class9   s     ;;& ''$$$    c                 $    |j                          y)zCreate a new call.N)save)r6   
serializers     r9   perform_createz%CurrentUserCallViewSet.perform_create@   s    r>   Fr.   r    )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r0   r"   r   Tdistinct)total_callstotal_missed_callstotal_attended_callsaverage_call_timeunique_callersrepeated_callersrM   r   rN   rO   rP   rQ   rR   )rM   rN   rO   average_call_time_secondsrQ   rR   r   )filter_querysetr:   	aggregater   r   r   FAILEDr4   
SUCCESSFULr   r   r   HTTP_200_OK)r6   r*   filtered_querysetr    report_datas        r9   r    zCurrentUserCallViewSet.summaryD   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_dater,   Nr
      )dayscreated_at__gtecreated_at__ltr!   tzinfo)dayrj   rG   r   rK   )rM   rQ   r   )unique
repetitiverQ   rM   datez%b-%ddaily_callsrT   )#r   query_paramsis_validvalidated_datarm   rU   r:   r+   r
   get_default_timezonegetattrr,   pytz	Exception
make_awarer   combinemintimer   r0   annotater   valuesr   r5   rangerd   maxsortedkeysstrftimer   r   rY   )r6   r*   rA   	validatedra   rb   rZ   r+   
company_tzstart_dtend_dt_exclusivequeryset_in_range	daily_aggi
days_rangerow	local_dayrk   totalrj   results                        r9   rn   z"CurrentUserCallViewSet.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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.r,   Nr
   rc   re   r!   yearrh   month)r   r   rG   r   rH   rJ   )rM   missed_calls)total_calls__gtJanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)rc                        	   
         zMonth rM   r   z0%d   %)r   callsmissedrT   )rU   r:   r+   r
   rr   rs   r,   rt   ru   nowr   rv   r   r0   rz   r	   r{   r   r   r5   intr.   roundappendr   r   rY   )r6   r*   rZ   r+   r   current_yearstart_of_yearend_of_yearcurrent_year_querysetmonthly_aggmonth_namesr   r   	month_num
month_namerM   r   missed_percentages                     r9   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_   ra   rb   )rf   created_at__lter   g        )transferred_percentagenot_transferred_percentagefailed_percentageunknown_percentagerM   rT   rc   rH   r   )r   rc   r   )transfer_status__inr   )r   r   r   r   )r   ro   rp   rq   rU   r:   r0   countr   r   rY   excluder   )r6   r*   rA   r   ra   rb   rZ   calls_in_rangerM   transferred_countnot_transferred_countfailed_countunknown_countr   r   r   r   s                    r9   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__r   r<   r   r-   allr/   r   permission_classesr   pagination_classr   r   r   filter_backendsr   filterset_classsearch_fieldsordering_fieldsorderingr:   r=   rB   r   r    rn   r   r    r>   r9   r   r      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   )-loggingr   r   django.db.modelsr   r   r   django.db.models.functionsr   r	   django.utilsr
   django_filters.rest_frameworkr   rest_frameworkr   r   rest_framework.decoratorsr   rest_framework.filtersr   r   rest_framework.permissionsr   rest_framework.responser   apps.companies.modelsr   apps.calls.constantsr   r   apps.calls.filtersr   apps.calls.modelsr   apps.calls.paginationr   apps.calls.serializersr   r   	getLoggerr   loggerModelViewSetr   r   r>   r9   <module>r      sj     ( * * 9 ! = + , ? 6 , ) 9 ) " ; " 
		8	$w&X22 w&r>   