
    -&i                        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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/J0r0  S SK1J2r2  S SK3r3SSK4J5r5  SSK6J7r7  S SK8J9r9  S SK:J;r;  S SK<J=r=  S SK>J?r?  \" SS/5      \" \/5      S 5       5       r@\" / SQ5      \" \/5      S 5       5       rAS rBS  rC\" S/5      \" \/5      S! 5       5       rDS" rB\" S/5      \" \/5      S# 5       5       rE\" S/5      \" / 5      \" \/5      S$ 5       5       5       rF\" S/5      \" / 5      \" \/5      S% 5       5       5       rGg)&    )api_viewpermission_classesauthentication_classes)AllowAny)Responsestatus)transaction)SumCountMinMaxQ)timezone)	timedeltadatetime)HttpResponse)Workbook)Font	AlignmentPatternFillBorderSide)get_column_letter)colors)letterA4)SimpleDocTemplateTable
TableStyle	ParagraphSpacer	PageBreak)getSampleStyleSheetParagraphStyle)inchN   )Project)ProjectSerializer)Stamp)Task)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project_list.GETerrorz)An error occurred while fetching projectsr   r/   datazproject_list.POSTz(An error occurred while creating project)methodr(   objectsallr)   r   r4   	Exceptionr-   r	   HTTP_500_INTERNAL_SERVER_ERRORr
   atomicis_validsaveHTTP_201_CREATEDerrorsHTTP_400_BAD_REQUEST)requestprojects
serializeres       D:\TimeStamps\projects\views.pyproject_listrE      sI    ~~		**,H*8$?JJOO,, 
6	!	##%.GLLA
&&((OO%#JOOF<S<ST	 &%
  
 1 1&:U:UV &% 
"  	(!,EF<< 	 &%  	)1-DE<< 	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project_detail.get_projectr2   (An error occurred while fetching projectr.   zproject_detail.GETz0An error occurred while fetching project detailsrF   r3   zproject_detail.PUTz(An error occurred while updating projectrG   zproject_detail.DELETEz(An error occurred while deleting project)r(   r6   getDoesNotExistr   r	   HTTP_404_NOT_FOUNDr8   r-   r9   r5   r)   r4   r
   r:   r;   r<   r>   r?   deleteHTTP_204_NO_CONTENT)r@   rJ   projectrC   rB   s        rD   project_detailrR   8   s'   	
//%%%, ~~	*73JJOO,, 
5	 	##%.w\\J
&&((OO%#JOO4	 &%
  
 1 1&:U:UV &% 
8	#		##% v'A'AB &% 
$G  :v8899 
.2@A88
 	

  	*A.LM<< 	 &%  	*A.DE<< 	 &%  	-q1DE<< 	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 ;   aW  U R                  S5      n[	        U5      S:  a7   [        US   5      =(       d    Sn[        US   5      =(       d    SnUS-  U-   $  [        U 5      n[        US-  5      $ ! [        [        4 a     N,f = f! [         a     gf = f)9Parse duration string (HH:MM or decimal) to total minutesr   hrs :   r'   <   )	strreplacestripsplitlenint
ValueError
IndexErrorfloatduration_strpartshoursminutesdecimal_hourss        rD   parse_duration_to_minutesri   m   s     |$,,UB7==?L l""3'u:?E!H*eAh-,1
g--
l+=2%&& 
+   s$   5B) B? )B<;B<?
CCc                 6    U S:X  a  gU S-  nU S-  nUS SUS 3$ )z$Format total minutes to HH:MM stringr   00:00rY   02drW    )total_minutesrf   rg   s      rD   format_minutes_to_durationro      s6    REb GC['#''    c                     [         R                  R                  US9n [        R                  R                  US9R                  SS	5      nS
nU H.  nUR                  (       d  M  U[        UR                  5      -  nM0     [        U5      nUR                   (       a  [        UR                   5      OS
nXX-
  n	[        [#        U	5      5      n
US
:  a  XX-  S-  OS
n0 nU H  nUR                  (       d  M  UR$                  (       d  M)  ['        UR$                  R(                  5      nUR$                  R*                   SUR$                  R,                   3R/                  5       nX;  a	  UUS
S
S.X'   X   S==   [        UR                  5      -  ss'   X   S==   S-  ss'   M     / nUR1                  5        HD  nUR3                  US   US   [        US   5      US   US   US
:  a  US   U-  S-  OS
S.5        MF     UR5                  S SS9  0 nU H  nUR                  (       d  M  UR6                  (       d  M)  ['        UR6                  R(                  5      n[9        UR6                  SS5      =(       d&    [9        UR6                  SS5      =(       d    SUSS  3nUU;  a
  UUS
S
S.UU'   UU   S==   [        UR                  5      -  ss'   UU   S==   S-  ss'   M     / nUR1                  5        HD  nUR3                  US   US   [        US   5      US   US   US
:  a  US   U-  S-  OS
S.5        MF     UR5                  S SS9  UR;                  S S!5      R=                  5       nUR;                  S"S#5      R=                  5       nU(       a  UR>                  OSnU(       a  UR>                  OSnS
nU(       a  U(       a  UU-
  R@                  S-   n[B        RD                  " 5       R?                  5       nU[G        S$S%9-
  nU[G        S&S%9-
  nUR                  US'9RI                  5       nUR                  US'9RI                  5       nUR                  US'9RK                  SSS(9RM                  5       n [O        [Q        U 5      5      n!Sn"U(       a  UU-
  R@                  n"S
n#US
:  a  UU-  n$[S        U$S)-  S*5      n#/ n%[U        S+5       H  n&U[G        U&S,9-
  n'U'[G        S-S%9-
  n(UR                  U(U'S.9n)[W        S/ U) 5       5      n*U%R3                  U(RY                  5       U'RY                  5       [        U*5      U*U)RI                  5       S0.5        M     U%R[                  5         S1n+S2n,US
:  a   US3:  a  S4n+S5n,OUS6:  a  S7n+S8n,O
US9:  a  S:n+S;n,['        UR(                  5      UR\                  UUUS
:  a  [        U5      OS<UU	U
[S        US5      U	S
:  S=.U+U,S>.U(       a  URY                  5       OSU(       a  URY                  5       OSUU"S?.UUU!S@.U#URI                  5       SA.UUU%SB.n-[	        U-5      $ ! [         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[        SCU5        [	        SSD0[
        R                  S9s SnA$ SnAff = f)Ez)Get analytics data for a specific projectrI   r   zproject_analytics.get_projectr2   rK   N
project_idusertaskr   d    )user_id	user_namern   stamp_countrn   rz   r'   rx   ry   )rx   ry   total_hoursrn   rz   
percentagec                     U S   $ Nrn   rm   xs    rD   <lambda>#project_analytics.<locals>.<lambda>   s	    a.@rp   T)keyreversenamecodezTask    )task_id	task_namern   rz   r   r   )r   r   r{   rn   rz   r|   c                     U S   $ r~   rm   r   s    rD   r   r      s	    !O*<rp   datetimez-datez-time   )days   	date__gte)flatrY   rX      )weeks   )r   	date__ltec              3   p   #    U  H,  oR                   (       d  M  [        UR                   5      v   M.     g 7f)N)durationri   ).0ss     rD   	<genexpr>$project_analytics.<locals>.<genexpr>  s&     hk]g]gD8DDks   66)
week_startweek_endr{   rn   rz   on_trackzOn Trackx   over_budgetzOver Budgetn   at_riskzAt RiskP   under_budgetzUnder Budgetrk   )rg   	formattedr|   is_over)	indicatormessage)first_stamp_datelast_stamp_datedays_activedays_since_last_activity)stamps_last_7_daysstamps_last_30_daysactive_users_count)average_hours_per_daytotal_stamps)rs   project_nametotal_hours_spentrn   estimated_hoursestimated_minutesvariancer	   timelinerecent_activity
efficiencyhours_by_employeehours_by_taskweekly_breakdownzproject_analytics.calculatez5An error occurred while calculating project analytics)/r(   r6   rL   rM   r   r	   rN   r8   r-   r9   r*   filterselect_relatedr   ri   ro   estimated_timeabsrt   rZ   id	firstnamelastnamer\   valuesappendsortru   getattrorder_byfirstr   r   r   nowr   countvalues_listdistinctr^   setroundrangesum	isoformatr   r   ).r@   rJ   rQ   rC   stampsrn   stamptotal_hours_formattedr   variance_minutesvariance_formattedvariance_percentager   rx   ry   employee_breakdown	user_datar   r   r   task_breakdown	task_datafirst_stamp
last_stampr   r   r   todayseven_days_agothirty_days_agorecent_stamps_7drecent_stamps_30dactive_user_idsr   r   avg_hours_per_dayavg_minutes_per_dayr   ir   r   week_stampsweek_minutesstatus_indicatorstatus_messageanalytics_datas.                                                 rD   project_analyticsr      s2   	
//%%%,@
%%%4CCFFS E~~~!:5>>!JJ  !;= I RYQgQg5g6L6LMmn )<7<L8MNK\_`K`}@3Ffg E~~~%***ejjmm,$zz334Aejj6I6I5JKQQS	3#*%.)*'(	2%. "*?;?XY^YgYg?hh;!*=9Q>9   *113I%%$Y/&{39)O:TU!*?!;(7TadeTey9MICOkl'  4 	$@$O E~~~%***ejjmm,#EJJ={U[]aAb{hmnuvxwxnymzf{	-/#*%.)*'(	.M'* g&7;TUZUcUc;dd7g&}5:5   &--/I!!$Y/&{39)O:TU!*?!;(7TadeTey9MICOkl#  0 	 <dK ooff5;;=__Wg6<<>
/:;++-7*//T*-==CCaGK ##%!22)"44!==>=BHHJ"MMOMDJJL !--/-BNNy_cNdmmo _!56 $( (-(?'E'E$ ?"/+"= %&9B&> B rAyq11H!I1$55J --*-QKhkhhL##(224$..09,G!-*002%   	  " &#q "S(#0 !.$s*#, !*$r)#1 !/ gjj/#LL!6*PadePe9:KLkr!2+/#$7;+a/	 .)
 EU$4$>$>$@Z^BQ?#<#<#>W[*,D	 '7'8&8  *; & "4+ 0E#
J ''E  :v8899 
115@A88
 	

D  
/3MN88
 	

sb   Y AZ, 'BZ, 7Z, 
D Z, .Z, PZ, +Z)0	Z)9%Z$Z)$Z),
[&6%[![&![&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)rT   r   rU   rV   rW   r'   rY   )	rZ   r[   r\   r]   isdigitr_   r^   rb   r`   rc   s        rD   ri   ri   c  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n	U(       a  U	R                  US9n	U(       a  U	R                  US	9n	U	R                  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S   S9nSnU H  nU[        UR                  5      -  nM     US-  nUS-  nUR#                  [%        US   5      US    SUS    3US   UUU SUS 3UR'                  5       S.5        M     / n[(        R                  R                  UR                  S9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R,                  UR.                  UR0                  UUU SUS 3UR'                  5       S.	5        M     SnUR2                  (       aa  [%        UR2                  R                  5      UR2                  R*                  UR2                  R4                  UR2                  R6                  S.nOUR8                  (       a  SUR8                  0nUR#                  [%        UR                  5      UR*                  UR,                  UR.                  UR:                  UR<                  (       a  UR<                  R?                  S5      OSUR@                  (       a  UR@                  R?                  S5      OSURB                  (       a  URB                  R?                  S5      OSUR0                  US.
UUU SUS 3U
R'                  5       UR'                  5       UR'                  5       S.UUS.5        GM     [E        UUUUS.S.5      $ ! [
         a     GNwf = f! [
         a     GN[f = f! [F         a0  n[I        S U5        [E        S!S"0[:        RJ                  S#9s SnA$ SnAff = f)$z
Generate project report with task details, hours, and employee information
Query params: project_id (optional - if not provided, returns all projects), start_date, end_date
rs   
start_dateend_dateN%Y-%m-%dr   rr   r   r   rt   ru   r   rY   rx   user__firstnameuser__lastnameuser__emailrx   rw   rW   rl   )r   r   emailr{   rn   r   rz   r   )	r   r   r   descriptionr   r{   rn   r   rz   )r   r   contact_emailcontact_phoner   )
r   r   r   r   r	   r   r   due_dater   client)r{   rn   r   r   total_tasksunique_employees_count)rQ   summarytasks	employees)rs   r   r   )reportsfiltersproject_reportr2   z1An error occurred while generating project reportr   )&query_paramsrL   r   strptimer   r`   r(   r6   r   r7   r*   r   r   ri   r   r   r   r   rZ   r   r+   r   r   r   r   customerr   r   r  r	   r   strftimer   r   r   r8   r-   r9   )r@   rs   r   r   start_date_objend_date_objrA   project_reportsrQ   stamps_queryr   rn   r   r{   remaining_minutesunique_employeesemployee_hoursemp
emp_stampsemp_minutes	emp_hoursemp_remaining_minutestask_detailsr  ru   task_stampstask_minutes
task_hourstask_remaining_minutesclient_inforC   s                                  rD   r	  r	  u  s,   Y
))--l;
))--l;
''++J7 !)!2!2:z!J!O!O!Q '00:FKKM
 ---<H**,HG ==//7::/FL+22^2L+22\2J!00@F M!:5>>!JJ   (2-K - 2  &}}! 	 
 hj   N'#]]3y>]B
'E#<U^^#LLK ( (2-	(3b(8%%%c)n-"#456a<L8M7NO /#,%:09{!<QRU;V-W#-#3#3#5'  (( LLL''7::'>E$mmDGGm< (E $=enn$MML ) *R/
)5):&##dgg, II II#'#3#3&*&9&9#-%;0:|1=STW<X-Y#.#4#4#6
% 
 , Kg..112#,,11%,%5%5%C%C%,%5%5%C%C	  GNN ""gjj/#LL#LL#*#6#6%nnMTM_M_'"4"4"="=j"IeiIPIYIY 0 0 9 9* E_cIPIYIY 0 0 9 9* E_c&-&<&<) $/%60;}A>OPS=T-U$*LLN#(;;=.>.D.D.F &+-$ q  b &(($
  	C  
  H  
"A&IJ88
 	

sg   AT %S. T %S? 1P<T .
S<8T ;S<<T ?
T	T TT 
U
%U?U
U
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,                   S UR.                  =(       d    S S!3Ul        [        SS"S9Ul        [        S#S#S	S
9Ul        US-  n[2        R                  R                  UR4                  S$9nU(       a  UR                  US%9nU(       a  UR                  US&9nUR7                  S'S(5      nS)nU H  nU[9        UR:                  5      -  nM     US*-  nUS*-  n[<        R                  R                  UR4                  S$9nS+UR?                  USS,9l        [        SS-9UR?                  USS,9l        S.U S/US0 3UR?                  US1S,9l        S2URA                  5        3UR?                  USS,9l        S3URA                  5        3UR?                  US4S,9l        US1-  n/ S5Qn[C        US5       HA  u  nnUR?                  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R4                  S69nS)nU H  nU[9        UR:                  5      -  nM     US*-  nUS*-  nUR,                  UR?                  USS,9l        UR.                  =(       d    SUR?                  US1S,9l        URF                  =(       d    SUR?                  USS,9l        U S/US0 3UR?                  US4S,9l        URA                  5       UR?                  US7S,9l        [I        SS85       H  nXR?                  UUS,9l"        M     US-  nGM&     US-  n/ S9Qn[C        US5       HA  u  nnUR?                  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RK                  S:S;S<S=5      RM                  5       n U  GH  n!UR                  U!S:   S>9n"S)n#U" H  nU#[9        UR:                  5      -  n#M     U#S*-  n$U#S*-  n%U!S;    S?U!S<    3RO                  5       n&U&=(       d    U!S=   UR?                  USS,9l        U!S=   UR?                  US1S,9l        U$ S/U%S0 3UR?                  USS,9l        U"RA                  5       UR?                  US4S,9l        [I        SS75       H  nXR?                  UUS,9l"        M     US-  nGM     US1-  nGM     [I        SS85       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'S1-   S@5      n)U)URX                  U(   l-        M     []        SASB9n*SCU=(       d    SD SEU=(       d    SD SF3n+SGU+ SH3U*SI'   UR_                  U*5        U*$ ! [
         a     GNf = f! [
         a     GNf = f!    M  = f! [`         a0  n,[c        SJU,5        [e        SKSL0[f        Rh                  SM9s Sn,A,$ Sn,A,ff = f)NzV
Generate project report as Excel file
Query params: project_id, start_date, end_date
rs   r   r   Nr   r   Project Report366092solid)start_color	end_color	fill_typeTFFFFFFr   )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	Project:  ()   D3D3D3rr   r   r   rt   ru   r   rY   Summary)rowcolumn)r(  Total Hours: rW   rl   rX   zTotal Stamps: zTotal Tasks:    z	Task NameCode	EstimatedzActual HoursStampsr      r   zEmployee NameEmailzTotal HoursrH  rx   r   r   r   r   rw   2   zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetcontent_typeproject_report_r7   _z.xlsxattachment; filename=""Content-Dispositionproject_report_excelr2   z/An error occurred while generating Excel reportr   )5r
  rL   r   r  r   r`   r(   r6   r   r7   r   activetitler   r   r   r   merge_cellsvaluefontr   	alignmentr   r   fillr*   r   r   ri   r   r+   cellr   	enumerateborderr   r   r   r   r\   r   r^   rZ   mincolumn_dimensionswidthr   r<   r8   r-   r   r	   r9   )-r@   rs   r   r   r  r  rA   wbwsheader_fillheader_fontr^  
title_cellrA  rQ   project_headerr  r   rn   r   r{   r  r  headerscolheaderr\  ru   r  r  r  r  r  r  r  r  r  r  emp_name
max_lengthrB  adjusted_widthresponsefilenamerC   s-                                                rD   rT  rT    s'   B
))--l;
))--l;
''++J7 !)!2!2:z!J!O!O!Q '00:FKKM
 ---<H**,H ZYY# "h(V]^H2>F#V$6"f%	
 	wX
+
Dr2
(HxP
*:+>*?tHDUPUCVWB3%yM1HCq  GNNQse2cU+,!C5	]N%.w||nBw||?Tu>UUV#WN "&Dr":N"-(hbi"jN1HC !==//7::/FL+22^2L+22\2J!00@F M!:5>>!JJ   (2-K - 2LL''7::'>E 09BGGAG&,.2oBGGAG&+1>{m1M^_bLc/dBGGAG&,1??O/PBGGAG&,1>u{{}o/NBGGAG&,1HC SG(!4Vww3sw3#
'	'	$!*h!R  5 1HC $mmDGGm< (E $=enn$MML ) *R/
)5):&3799C*037993EC*0373F3F3O%C*06@\CYZ]B^3_C*03>3D3D3FC*0 A;C:@GGCG07 ' q% ( 1HC JG(!4Vww3sw3#
'	'	$!*h!R  5 1HC  &}}! 	 
 hj  (#]]3y>]B
'E#<U^^#LLK ( (2-	(3b(8%!"345Qs;K7L6MNTTV3;3Qs=?QC*036}3EC*06?[BWX[A\3]C*03=3C3C3EC*0 A;C:@GGCG07 ' q% (( 1HC[  ` A;CJ&s+F6
3tzz?+j8%(TZZ%9
 9 # !a4N1?B  (.   \
 %Z%85$98;Lu:MUS,B8*A*N&'
a  
  |  
(!,GH88
 	

s   A^" %]8 ^" %^	 1X^" A ^A,^" 8
^^" ^^" 	
^^" ^^" ^^" "
_,%___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,                   SUR.                  =(       d    S S3U5      5        [0        R                  R                  UR2                  S 9nU(       a  UR                  US!9nU(       a  UR                  US"9nUR5                  S#S$5      nS%nU H  nU[7        UR8                  5      -  nM     US&-  nUS&-  n[:        R                  R                  UR2                  S 9nS'U S(US) S*UR=                  5        S+UR=                  5        3nU	R)                  ['        UU
S   5      5        U	R)                  [+        SS[        -  5      5        / S,Q/nU H  nUR                  UR2                  S-9nS%nU H  nU[7        UR8                  5      -  nM     US&-  nUS&-  nUR)                  UR,                  UR.                  =(       d    SUR>                  =(       d    SU S(US) 3[A        UR=                  5       5      /5        M     [C        US.[        -  S[        -  S[        -  S[        -  S/[        -  /S09nURE                  [G        S1S2S3["        R$                  " S5      4S4S2S3["        RH                  4S5S6S7S8S1S9S:["        RJ                  4S;S2S:S["        RL                  4S</	5      5        U	R)                  U5        U	R)                  [+        SS[        -  5      5        / S=Q/nURO                  S>S?S@SA5      RQ                  5       n U  H  n!UR                  U!S>   SB9n"S%n#U" H  nU#[7        UR8                  5      -  n#M     U#S&-  n$U#S&-  n%U!S?    SCU!S@    3RS                  5       n&UR)                  U&=(       d    U!SA   U!SA   U$ S(U%S) 3[A        U"R=                  5       5      /5        M     [C        US.[        -  S.[        -  S[        -  S/[        -  /S09n'U'RE                  [G        S1S2S3["        R$                  " S5      4S4S2S3["        RH                  4S5S6S7S8S1S9S:["        RJ                  4S;S2S:S["        RL                  4S</	5      5        U	R)                  U'5        U	R)                  [U        5       5        GM     URW                  U	5        [Y        UR[                  5       SDSE9n(SFU=(       d    SG SHU=(       d    SG SI3n)SJU) SK3U(SL'   U($ ! [
         a     GNf = f! [
         a     GNlf = f! [\         a0  n*[_        SMU*5        [a        SNSO0[b        Rd                  SP9s Sn*A*$ Sn*A*ff = f)QzT
Generate project report as PDF file
Query params: project_id, start_date, end_date
rs   r   r   Nr   r   g      ?)pagesize	topMarginbottomMarginCustomTitleHeading1   z#366092r   r'   )parentfontSize	textColor
spaceAfterrZ  r!  g?r7  r8  r9  Normalg?ProjectHeaderHeading2r>  
      )rw  rx  ry  rz  spaceBeforer;  r<  r=  rr   r   r   rt   ru   r   rY   rC  rW   rl   z | Total Stamps: z | Total Tasks: rE  r   rX   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  	   rJ  rx   r   r   r   r   rw   zapplication/pdfrM  rO  r7   rP  z.pdfrQ  rR  rS  project_report_pdfr2   z-An error occurred while generating PDF reportr   )3r
  rL   r   r  r   r`   r(   r6   r   r7   ioBytesIOr   r   r&   r$   r%   r   HexColorr!   r   r"   r   r   r*   r   r   ri   r   r+   r   r   rZ   r   setStyler    
whitesmokebeigegreyr   r   r\   r#   buildr   getvaluer8   r-   r   r	   r9   )+r@   rs   r   r   r  r  rA   bufferdocelementsstylestitle_stylerV  filter_textrQ   project_styler  r   rn   r   r{   r  r  summary_text
table_dataru   r  r  r  r  tableemployee_table_datar  r  r  r  r  r  rk  	emp_tablern  ro  rC   s+                                              rD   r  r    sL   x
))--l;
))--l;
''++J7 !)!2!2:z!J!O!O!Q '00:FKKM
 ---<H**,H s4xVYZ^V^_$&$*%ooi0
 *K8q#d(+, ()<u(=T(BSeATUKOOIk(3CDEOOF1c$h/0  G*j) //)4M OOI	',,r',,BWRWAXXY&Z\ijk !==//7::/FL+22^2L+22\2J!00@F M!:5>>!JJ   (2-K - 2LL''7::'>E +;-q9J38OO`agamamao`p  qA  BG  BM  BM  BO  AP  QLOOIlF84DEFOOF1c$h/0 WWJ$mmDGGm< (E $=enn$MML ) *R/
)5):&!!IIII&''05!l!$:3#?@))+,#  $ *4444QTUYQY0Z[ENN:vw	0JKfgv/@/@A3?16vx>1fkk:1
' 
 
 OOE"OOF1c$h/0 $W"W%}}! 	 
 hj  (#]]3y>]B
'E#<U^^#LLK ( (2-	(3b(8%!"345Qs;K7L6MNTTV#**2M 2& k#8"=>
((*+	,  ($ 1afafaPTfVYZ^V^=_`Izvw	0JKfgv/@/@A3?16vx>1fkk:1
+ 
  
 OOI&OOIK(g  l 			(   1@QR$Z%85$98;Lu:MTR,B8*A*N&'M  
  F  
&*EF88
 	

sg   A\! %[? \! %\ 1Y\! ?
\	\! \\! 
\\! \\! !
]+%]]])Hrest_framework.decoratorsr   r   r   rest_framework.permissionsr   rest_framework.responser   rest_frameworkr	   	django.dbr
   django.db.modelsr   r   r   r   r   django.utilsr   r   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)   stamps.modelsr*   tasks.modelsr+   user.modelsr,   ErrorLogs.utilsr-   rE   rR   ri   ro   r   r	  rT  r  rm   rp   rD   <module>r     s   Z Z / , ! ! 4 4 ! ( $  F F ,   . a a D $ 	  *    %	5&/XJ   8 

"#XJ0   $0f6( 
5'XJM
   M
`$ 
5'XJ^
   ^
B 
5'XJG
    G
T 
5'XJ}
    }
rp   