
    -&iY                        S SK JrJrJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJrJrJrJrJr  S SKJr  S SKJ r   S SK!J"r"J#r#  S SK$J%r%J&r&J'r'J(r(J)r)J*r*  S SK+J,r,J-r-  S SK.J/r/  S SK0r0SSK1J2r2  SSK3J4r4  S SK5J6r6  S SK7J8r8  S SK9J:r:  S SK;J<r<  \" SS/5      \" \/5      S 5       5       r=\" / SQ5      \" \/5      S 5       5       r>S r?\" S/5      \" \/5      S  5       5       r@\" S/5      \" / 5      \" \/5      S! 5       5       5       rA\" S/5      \" / 5      \" \/5      S" 5       5       5       rBg)#    )api_viewpermission_classesauthentication_classes)AllowAny)Responsestatus)transaction)SumCountQ)timezone)datetime)HttpResponse)Workbook)Font	AlignmentPatternFillBorderSide)get_column_letter)colors)letterA4)SimpleDocTemplateTable
TableStyle	ParagraphSpacer	PageBreak)getSampleStyleSheetParagraphStyle)inchN   )Client)ClientSerializer)Project)Stamp)User)	log_errorGETPOSTc                     U R                   S:X  a>   [        R                  R                  5       n[	        USS9n[        UR                  5      $ U R                   S:X  a   [        R                  " 5          [	        U R                  S	9nUR                  5       (       a;  UR                  5         [        UR                  [        R                  S9sS S S 5        $ [        UR                   [        R"                  S9sS S S 5        $ g ! [         a0  n[        SU5        [        SS0[        R                  S9s S nA$ S nAff = f! , (       d  f       g = f! [         a0  n[        S
U5        [        SS0[        R                  S9s S nA$ S nAff = f)Nr+   T)manyzclient_list.GETerrorz(An error occurred while fetching clientsr   r,   datazclient_list.POSTz'An error occurred while creating client)methodr%   objectsallr&   r   r1   	Exceptionr*   r	   HTTP_500_INTERNAL_SERVER_ERRORr
   atomicis_validsaveHTTP_201_CREATEDerrorsHTTP_400_BAD_REQUEST)requestclients
serializeres       D:\TimeStamps\clients\views.pyclient_listrB      sI    ~~		nn((*G)'=JJOO,, 
6	!	##%-7<<@
&&((OO%#JOOF<S<ST	 &%
  
 1 1&:U:UV &% 
"  	'+DE<< 	 &%  	(!,CD<< 	sf   <D  E 5AE	E !E:	E 
D?%D:4D?:D?
EE E 
F%FFF)r+   PUTDELETEc                 $    [         R                  R                  US9nU R                  S:X  a!   [        U5      n[	        UR                  5      $ U R                  S	:X  a   [        R                  " 5          [        X R                  S
9nUR                  5       (       a.  UR!                  5         [	        UR                  5      sS S S 5        $ [	        UR"                  [
        R$                  S9sS S S 5        $ U R                  S:X  aG   [        R                  " 5          UR'                  5         [	        [
        R(                  S9sS S S 5        $ g ! [         R                   a    [	        [
        R                  S9s $ [         a0  n[        SU5        [	        SS0[
        R                  S9s S nA$ S nAff = f! [         a0  n[        SU5        [	        SS0[
        R                  S9s S nA$ S nAff = f! , (       d  f       g = f! [         a0  n[        SU5        [	        SS0[
        R                  S9s S nA$ S nAff = f! , (       d  f       g = f! [         a0  n[        SU5        [	        SS0[
        R                  S9s S nA$ S nAff = f)N)pkr   zclient_detail.get_clientr/   z'An error occurred while fetching clientr+   zclient_detail.GETz/An error occurred while fetching client detailsrC   r0   zclient_detail.PUTz'An error occurred while updating clientrD   zclient_detail.DELETEz'An error occurred while deleting client)r%   r3   getDoesNotExistr   r	   HTTP_404_NOT_FOUNDr5   r*   r6   r2   r&   r1   r
   r7   r8   r9   r;   r<   deleteHTTP_204_NO_CONTENT)r=   rF   clientr@   r?   s        rA   client_detailrM   8   s&   	
##r#* ~~	)&1JJOO,, 
5	 	##%-f<<H
&&((OO%#JOO4	 &%
  
 1 1&:U:UV &% 
8	#		##%v'A'AB &% 
$G  :v8899 
,a0?@88
 	

  	)1-KL<< 	 &%  	)1-CD<< 	 &%  	,a0CD<< 	s   E F9 !H 6AG6	H !G6.	H 	I 'I	I +F6=	F6%F1+F61F69
G3%G.(G3.G36
H H H 
I%H<6I<I
II I 
J%J
J
Jc                    U (       d  g[        U 5      R                  SS5      R                  5       n SU ;   ax  U R                  S5      nUS   R	                  5       (       a  [        US   5      OSn[        U5      S:  a&  US   R	                  5       (       a  [        US   5      OSnUS-  U-   $  [        U 5      n[        US-  5      $ ! [         a     gf = f)z9Parse duration string (HH:MM or decimal) to total minutesr   hrs :r$   <   )	strreplacestripsplitisdigitintlenfloat
ValueError)duration_strpartshoursminutesdecimal_hourss        rA   parse_duration_to_minutesra   m   s    |$,,UB7==?L
l""3'!&q!1!1!3!3E!H#&u:>eAh6F6F6H6H#eAh-a
g%%	!,/M}r)** 		s   1C
 

CCc                     U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nSnSnU(       a&   [        R                  " US5      R	                  5       nU(       a&   [        R                  " US5      R	                  5       nU(       a  [        R                  R                  US9nO[        R                  R                  5       n/ nU GH  n[        R                  R                  [        UR                  S9[        UR                  S9-  5      n	[        U	R                  S	S
S95      n
[        R                  R                  U
S9nU(       a  UR                  US9nU(       a  UR                  US9nUR!                  SSS5      nSnU H  nU[#        UR$                  5      -  nM     US-  nUS-  nUR'                  SSSS5      R)                  5       n/ nU	 H  nUR                  UR*                  S9nSnU H  nU[#        UR$                  5      -  nM     US-  nUS-  nUR-                  [/        UR*                  5      UR                  UR0                  UR2                  UUU SUS 3UR5                  5       S.5        M     UR-                  [/        UR*                  5      UR                  UR6                  UR8                  UR:                  UR<                  S.U	R5                  5       UUU SUS 3UR5                  5       UR5                  5       S.UU Vs/ s H#  n[/        US   5      US    SUS    3US   S.PM%     snS .5        GM     [?        UUUUS!.S".5      $ ! [
         a     GNf = f! [
         a     GN f = fs  snf ! [@         a0  n[C        S#U5        [?        S$S%0[2        RD                  S&9s SnA$ SnAff = f)'z
Generate client report with project details, hours, and employee information
Query params: client_id (optional - if not provided, returns all clients)
	client_id
start_dateend_dateN%Y-%m-%didcustomer__namerL   rh   Tflatproject_id__in	date__gte	date__lteuserprojecttaskr   rR   user_iduser__firstnameuser__lastnameuser__email
project_idrQ   02d)rh   namecoder	   total_hourstotal_minutestotal_hours_formattedstamp_count)rh   r~   descriptioncontact_emailcontact_phoneaddress)total_projectsr   r   r   total_stampsunique_employees_count )rh   r~   email)rL   summaryprojects	employees)rc   rd   re   )reportsfiltersclient_reportr/   z0An error occurred while generating client reportr   )#query_paramsrG   r   strptimedater[   r%   r3   filterr4   r'   r   r~   listvalues_listr(   select_relatedra   durationvaluesdistinctrh   appendrS   r   r	   countr   r   r   r   r   r5   r*   r6   )r=   rc   rd   re   start_date_objend_date_objr>   client_reportsrL   r   project_idsstamps_querystampsr   stampr   remaining_minutesunique_employeesproject_detailsru   project_stampsproject_minutesproject_hoursproject_remaining_minutesempr@   s                             rA   r   r      s   {
((,,[9	))--l;
''++J7 !)!2!2:z!J!O!O!Q '00:FKKM
 nn++y+9Gnn((*GF---0EEH
 x33Dt3DEK ==//{/KL+22^2L+22\2J!00FKF M!:5>>!JJ   (2-K - 2  &}}! 	 
 hj  !O#!''**!E"#+E#'@'PPO , !02 5,;b,@)&&gjj/#LL#LL%nn#0%>0=a@YZ]?^-_#1#7#7#9	( 	 $( !!fii."KK#)#5#5%+%9%9%+%9%9%~~ '/nn&6#.%60;}A>OPS=T-U$*LLN.>.D.D.F ,  0  0	 "#i.1#&'8#9":!C@P<Q;R S!$]!3
  0%# o f %&($
  	G  
  h$  
/1%HI88
 	

ss   AN: %N N: %N$ 1JN: 	*N53N: 
N!N:  N!!N: $
N2.N: 1N22N: :
O4%O/)O4/O4c           	          U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nSnSnU(       a&   [        R                  " US5      R	                  5       nU(       a&   [        R                  " US5      R	                  5       nU(       a  [        R                  R                  US9nO[        R                  R                  5       n[        5       nUR                  nSUl        [        SSS	S
9n	[        SSSS9n
[        [!        SS9[!        SS9[!        SS9[!        SS9S9nUR#                  S5        US   nSUl        [        SSS9Ul        [)        SSS9Ul        SnU(       d  U(       a%  SU=(       d    S SU=(       d    S 3USU 3'   US-  nUS-  nU GH_  nUR#                  SU SU 35        USU 3   nSUR,                   3Ul        [        SS S9Ul        [        S!S!S	S
9Ul        US-  n[0        R                  R                  [3        UR,                  S"9[3        UR,                  S#9-  5      n[5        UR7                  S$SS%95      n[8        R                  R                  US&9nU(       a  UR                  US'9nU(       a  UR                  US(9nUR;                  S)S*S+5      nS,nU H  nU[=        UR>                  5      -  nM     US--  nUS--  nS.URA                  USS/9l        [        SS09URA                  USS/9l        S1URC                  5        3URA                  US2S/9l        S3U S4US5 3URA                  USS/9l        S6URC                  5        3URA                  US7S/9l        US2-  n/ S8Qn[E        US5       HA  u  nnURA                  UUS/9nUUl        U	Ul        U
Ul        UUl#        [)        SSS9Ul        MC     US-  nU GH  nUR                  URH                  S99nS,nU H  nU[=        UR>                  5      -  nM     US--  nUS--  n UR,                  URA                  USS/9l        URJ                  =(       d    SURA                  US2S/9l        URL                  URA                  USS/9l        U S4U S5 3URA                  US7S/9l        URC                  5       URA                  US:S/9l        [O        SS;5       H  nXRA                  UUS/9l#        M     US-  nGM     US2-  nGMb     [O        SS;5       H  nS,n![Q        U5      n"UU"    HF  n [S        [U        UR$                  5      5      U!:  a   [S        [U        UR$                  5      5      n!MF  MH     [W        U!S2-   S<5      n#U#URX                  U"   l-        M     []        S=S>9n$S?U=(       d    S@ SAU=(       d    S@ SB3n%SCU% SD3U$SE'   UR_                  U$5        U$$ ! [
         a     GNf = f! [
         a     GNif = f!    M  = f! [`         a0  n&[c        SFU&5        [e        SGSH0[L        Rf                  SI9s Sn&A&$ Sn&A&ff = f)JzT
Generate client report as Excel file
Query params: client_id, start_date, end_date
rc   rd   re   Nrf   rg   Client Report366092solid)start_color	end_color	fill_typeTFFFFFF   )boldcolorsizethin)style)leftrighttopbottomzA1:F1A1   )r   r   center)
horizontalvertical   Date Range: N/A to Ar$   z:FClient:    D3D3D3ri   rk   rh   rl   rn   rp   rr   rt   ru   rv   r   rR   Summary)rowcolumn)r   Total Projects:    zTotal Hours: rQ   r}   zTotal Stamps:    zProject NameCodeStatuszTotal HoursStampsr{         2   zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetcontent_typeclient_report_r4   _z.xlsxattachment; filename=""Content-Dispositionclient_report_excelr/   z/An error occurred while generating Excel reportr   )4r   rG   r   r   r   r[   r%   r3   r   r4   r   activetitler   r   r   r   merge_cellsvaluefontr   	alignmentr~   fillr'   r   r   r   r(   r   ra   r   cellr   	enumerateborderrh   r   r	   ranger   rY   rS   mincolumn_dimensionswidthr   r9   r5   r*   r   r6   )'r=   rc   rd   re   r   r   r>   wbwsheader_fillheader_fontr   
title_cellr   rL   client_headerr   r   r   r   r   r   r   r   headerscolheaderr   ru   r   r   r   r   
max_lengthr   adjusted_widthresponsefilenamer@   s'                                          rA   r   r     sx   ]
((,,[9	))--l;
''++J7 !)!2!2:z!J!O!O!Q '00:FKKM
 nn++y+9Gnn((*G ZYY" "h(V]^H2>F#V$6"f%	
 	wX
*
Dr2
(HxP
*:+>*?tHDUPUCVWB3%yM1HCq FNNQse2cU+,3%yMM$,V[[M":M!%4b!9M!,Xah!iM1HC ---0EEH
 x33Dt3DEK ==//{/KL+22^2L+22\2J!00FKF M!:5>>!JJ   (2-K - 2/8BGGAG&,.2oBGGAG&+1A(..BRAS/TBGGAG&,1>{m1M^_bLc/dBGGAG&,1??O/PBGGAG&,1HC RG(!4Vww3sw3#
'	'	$!*h!R  5 1HC $!''**!E"#+E#'@'PPO , !02 5,;b,@)3:<<C*03:<<3H5C*03:>>C*06C_AF_`cEd3eC*03A3G3G3IC*0 A;C:@GGCG07 ' q% $( 1HCQ V A;CJ&s+F6
3tzz?+j8%(TZZ%9
 9 # !a4N1?B  (.   \
 $J$7%#8(:Ke9LER,B8*A*N&'
W  
  r  
'+GH88
 	

s   AX& %W< X& %X 1RX& A XA,X& <
X
X& 	X

X& 
XX& XX& X# X& &
Y 0%YY Y c                     U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nSnSnU(       a&   [        R                  " US5      R	                  5       nU(       a&   [        R                  " US5      R	                  5       nU(       a  [        R                  R                  US9nO[        R                  R                  5       n[        R                  " 5       n[        U[        S[        -  S[        -  S9n/ n	[        5       n
[!        S	U
S
   S["        R$                  " S5      SSS9n['        SU5      nU	R)                  U5        U	R)                  [+        SS[        -  5      5        U(       d  U(       aY  SU=(       d    S SU=(       d    S 3nU	R)                  ['        XS   5      5        U	R)                  [+        SS[        -  5      5        U GH  n[!        SU
S   S["        R$                  " S5      SSS9nU	R)                  ['        SUR,                   3U5      5        [.        R                  R                  [1        UR,                  S9[1        UR,                  S9-  5      n[3        UR5                  S S!S"95      n[6        R                  R                  US#9nU(       a  UR                  US$9nU(       a  UR                  US%9nUR9                  S&S'S(5      nS)nU H  nU[;        UR<                  5      -  nM     US*-  nUS*-  nS+UR?                  5        S,U S-US. S/UR?                  5        3nU	R)                  ['        UU
S   5      5        U	R)                  [+        SS[        -  5      5        / S0Q/nU H  nUR                  UR@                  S19nS)nU H  nU[;        UR<                  5      -  nM     US*-  nUS*-  nUR)                  UR,                  URB                  =(       d    SURD                  U S-US. 3[G        UR?                  5       5      /5        M     [I        US2[        -  S[        -  S[        -  S[        -  S3[        -  /S49nURK                  [M        S5S6S7["        R$                  " S5      4S8S6S7["        RN                  4S9S:S;S<S5S=S>["        RP                  4S?S6S>S["        RR                  4S@/	5      5        U	R)                  U5        U	R)                  [U        5       5        GM!     URW                  U	5        [Y        UR[                  5       SASB9n SCU=(       d    SD SEU=(       d    SD SF3n!SGU! SH3U SI'   U $ ! [
         a     GNf = f! [
         a     GNf = f! [\         a0  n"[_        SJU"5        [a        SKSL0[D        Rb                  SM9s Sn"A"$ Sn"A"ff = f)NzR
Generate client report as PDF file
Query params: client_id, start_date, end_date
rc   rd   re   Nrf   rg   g      ?)pagesize	topMarginbottomMarginCustomTitleHeading1   z#366092   r$   )parentfontSize	textColor
spaceAfterr   r   g?r   r   r   Normalg?ClientHeaderHeading2r   
      )r  r  r  r  spaceBeforer   ri   rk   rh   Trl   rn   rp   rr   rt   ru   rv   r   rR   r   z | Total Hours: rQ   r}   z | Total Stamps: r   r{   r   g?)	colWidths
BACKGROUNDr   r   r   	TEXTCOLOR)ALIGNr  r  r  LEFT)FONTNAMEr  r  zHelvetica-Bold)FONTSIZEr  r  r  )BOTTOMPADDINGr  r  r   r   r$   r  GRID)r  r  r  	   zapplication/pdfr   r   r4   r   z.pdfr   r   r   client_report_pdfr/   z-An error occurred while generating PDF reportr   )2r   rG   r   r   r   r[   r%   r3   r   r4   ioBytesIOr   r   r#   r!   r"   r   HexColorr   r   r   r~   r'   r   r   r   r(   r   ra   r   r   rh   r   r	   rS   r   setStyler   
whitesmokebeigegreyr    buildr   getvaluer5   r*   r   r6   )#r=   rc   rd   re   r   r   r>   bufferdocelementsstylestitle_styler   filter_textrL   client_styler   r   r   r   r   r   r   r   summary_text
table_dataru   r   r   r   r   tabler   r   r@   s#                                      rA   r  r    s   Q
((,,[9	))--l;
''++J7 !)!2!2:z!J!O!O!Q '00:FKKM
 nn++y+9Gnn((*G s4xVYZ^V^_$&$*%ooi0
 /;7q#d(+, ()<u(=T(BSeATUKOOIk(3CDEOOF1c$h/0 F)j) //)4L OOI&>MN ---0EEH
 x33Dt3DEK ==//{/KL+22^2L+22\2J!00FKF M!:5>>!JJ   (2-K - 2 .hnn.>-??OP[}\]^ops]t  uF  GM  GS  GS  GU  FV  WLOOIlF84DEFOOF1c$h/0 VVJ#!''**!E"#+E#'@'PPO , !02 5,;b,@)!!LLLL)ENN$oQ'@&EF,,./#  $$ *4444QTUYQY0Z[ENN:vw	0JKfgv/@/@A3?16vx>1fkk:1
' 
 
 OOE"OOIK(Y ^ 			(   1@QR#J$7%#8(:Ke9LDQ,B8*A*N&'  
  x  
%q)EF88
 	

sg   AV %U2 V %V 1S V 2
V <V ?V  V 
VV VV 
W%W	W	W)Crest_framework.decoratorsr   r   r   rest_framework.permissionsr   rest_framework.responser   rest_frameworkr	   	django.dbr
   django.db.modelsr   r   r   django.utilsr   r   django.httpr   openpyxlr   openpyxl.stylesr   r   r   r   r   openpyxl.utilsr   reportlab.libr   reportlab.lib.pagesizesr   r   reportlab.platypusr   r   r   r   r   r    reportlab.lib.stylesr!   r"   reportlab.lib.unitsr#   r  modelsr%   serializersr&   projects.modelsr'   stamps.modelsr(   user.modelsr)   ErrorLogs.utilsr*   rB   rM   ra   r   r   r       rA   <module>rJ     sR   Z Z / , ! ! * * !  $  F F ,   . a a D $ 	  ) #   %	5&/XJ   8 

"#XJ0   $0f$ 
5'XJ@
   @
F 
5'XJb
    b
J 
5'XJV
    V
rI  