
    h
*i                       S SK Jr  S SKJr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  S	S
K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  S SK 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,  S SK-J.r.  S SK/r/S SKJ0r0J1r1J2r2J3r3J4r4  S SK5J6r6  S SK7J8r8  S SK9J:r:  S SK;J<r<  S SK=J>r>  S SK?J@r@JArAJBrBJCrCJDrD  S SKEJFrF  S SKGJHrH  S S KIJJrJJKrK  S S!KLJMrMJNrNJOrOJPrPJQrQJRrR  S S"KSJTrTJUrU  S S#KVJWrW  S SKXrXS SKYrYS SKZrZS4S$ jr[S% r\S5S& jr] " S' S(\R                  5      r_\" S)/5      \" \
/5      S* 5       5       r`\" S)/5      \" \
/5      S+ 5       5       ra\" S,/5      S- 5       rb\" S,/5      S. 5       rc\" S,/5      S/ 5       rd\" S,/5      S0 5       re\" S,/5      \" / 5      \" \
/5      S1 5       5       5       rf\" S,/5      \" / 5      \" \
/5      S2 5       5       5       rg\" S,/5      S3 5       rhg)6    )render)viewsetsstatus)api_viewpermission_classesauthentication_classes)AllowAny)SessionAuthentication)Response)transaction)Prefetch   )Stamp)StampSerializer)get_user_stamp_permissionscheck_stamp_permission)	log_error)Function)WorkBalance)ConfigurationConfigurationTranslation)BalanceDetail)Paycode)WorkingTimePolicyVacationPolicy)datetime	timedeltadate)timezoneN)QSumCountAvgFUser)Project)Client)HttpResponse)Workbook)Font	AlignmentPatternFillBorderSide)get_column_letter)colors)letterA4)SimpleDocTemplateTable
TableStyle	ParagraphSpacer	PageBreak)getSampleStyleSheetParagraphStyle)inchc                    0 nU (       a  [         R                  R                  U S9nU H  nUR                  nUS:w  aK   [        R                  R                  SUUR
                  S9R                  5       nU(       a  UR                  nUUR                  b  [        UR                  5      OSUR                  b  [        UR                  5      OSS.X$R
                  '   M     U$ ! [         a     Nhf = f)z
Helper function to consistently fetch configuration data (header, icon, color) 
for given stamp_functions, applying translations if needed.

Returns a dictionary: {function_ref_id: {'header': ..., 'icon': ..., 'color': ...}}
)function_ref_id__inenfunction_header)translation_typelanguagereference_id )headericoncolor)r   objectsfilterrE   r   function_ref_idfirsttranslated_text	ExceptionrF   strrG   )stamp_functionsuser_languageconfigurations_dictconfigurationsconfigrE   translations          D:\TimeStamps\stamps\views.py$get_configuration_data_for_functionsrV   (   s     &..55/5Z$F]]F$	":"B"B"I"I):!.%+%;%; #J # eg	  
 #!,!<!< !,2KK,CFKK(.4ll.FV\\*B; 6 67! %*  ! s   A
C%%
C21C2c                 f    U b  U S:X  a  g[        U S-  5      n[        U S-  S-  5      nUS SUS 3$ )zConvert seconds to HH:MM formatr   00:00  <   02d:)int)secondshoursminutess      rU   seconds_to_hhmmra   J   sF    'Q,4 E7T>b()GC['#''    c                 h  ^  U(       d  U(       a  SSK Jn  U" U5      nU(       d8  UT -
  R                  S-   n[        U 4S j[	        U5       5       5      nUS-  S-  $ SnT nX::  a  UR                  5       n	U	S:  a  UR                  n
UR                  nO7U	S:X  a  UR                  n
UR                  nOUR                  n
UR                  n[        R                  " X5      n[        R                  " X5      nX::  a  U[        SS9-  nX-
  R                  5       nX~-  nU[        SS9-  nX::  a  M  U$ )	z
Calculate expected working hours for a date range based on working time policy.
If working_policy is None, will fetch user's policy or company default.
r   get_active_working_policyr   c              3   h   >#    U  H'  nT[        US 9-   R                  5       S:  d  M#  Sv   M)     g7f)days   r   N)r   weekday).0i
start_dates     rU   	<genexpr>3calculate_expected_working_hours.<locals>.<genexpr>`   s6      I"3Q$ya'88AACaG q"3s   "2	2   rY   ri   rg   )worktimeservice.servicere   rh   sumrangerj   monday_friday_startmonday_friday_endsaturday_startsaturday_endsunday_start
sunday_endr   combiner   total_seconds)rm   end_dateworking_policyuser_idre   
total_daysweekdaysr{   current_daterj   
start_timeend_timestart_datetimeend_datetimeday_secondss   `              rU    calculate_expected_working_hoursr   S   s;    gE27;+11A5
 I%
"3 I I!|d""ML

"&&(Q;';;J%77H\'66J%22H'44J%00H ")),C''? )I1--L#4CCE$	q))1 
"4 rb   c                   V   ^  \ rS rSr\rS rS rU 4S jrS r	U 4S jr
U 4S jrSrU =r$ )	StampViewSet   c                 \    [         R                  R                  S5      R                  5       $ )z4Override queryset to include function names via joinuser)r   rH   select_relatedall)selfs    rU   get_querysetStampViewSet.get_queryset   s     }}++F37799rb   c                     UR                   R                  S5      nUR                   R                  S5      nUR                   R                  S5      nUR                   R                  S5      n[        R                  R	                  S5      R                  5       nU(       a  UR                  US9nU(       a  UR                  US9nOiU(       ab  U(       a[   [        R                  " US5      R                  5       n	[        R                  " US5      R                  5       n
UR                  X/S	9nS
n S nU(       ac   SSKJn  UR                  R                  US9R                  S5      R                  5       nU(       a  UR                  (       a  UR                  nUnU(       Gd  UR"                  (       Ga  [%        UR"                  S5      (       Ga  UR"                  R                  nU(       a   [%        UR"                  S5      (       a  UR"                  R&                  (       a  SSKJn  UR                  R                  UR"                  R&                  S9R                  S5      R                  5       nU(       a  UR                  (       a  UR                  nOU=(       d    S
nOU=(       d    S
nOUR"                  (       a  [%        UR"                  S5      (       a  UR"                  R&                  (       au   SSKJn  UR                  R                  UR"                  R&                  S9R                  S5      R                  5       nU(       a  UR                  (       a  UR                  n[)        UR+                  SSS95      n[-        UU5      nU R/                  USSU0S9nUR0                  n[3        U5      $ ! [         a     GNf = f! [          a     GN@f = f! [          a    U=(       d    S
n Nf = f! [          a     Nf = f! [          a     Nf = f! [          a0  n[5        SU5        [3        SS0[6        R8                  S9s S nA$ S nAff = f)Nr~   r   rm   r|   r   r~   r   %Y-%m-%ddate__ranger?   r   r%   idlangr   stamp_functionTflatfunctions_dictmanycontextzStampViewSet.listerrorz'An error occurred while fetching stampsr   )GETgetr   rH   r   r   rI   r   strptimer   
ValueErroruser.modelsr&   onlyrK   r   rM   r   hasattrr   setvalues_listrV   get_serializerdatar   r   r   HTTP_500_INTERNAL_SERVER_ERROR)r   requestargskwargsr~   r   rm   r|   querysetstart_date_objend_date_objrP   target_user_idr&   target_usercached_langr   rO   rQ   
serializerr   es                         rU   listStampViewSet.list   so   Y	kkooi0G;;??6*D 6J{{z2H }}33F;??AH #??7?;#???5%-%6%6z:%N%S%S%UN#+#4#4Xz#J#O#O#QL'N;YZH !M*!%4&*ll&9&9W&9&E&J&J6&R&X&X&Z&;+;+;,7,<,<M-4N
 &',,,77<<QW;X;X"),,"3"3K"@&w||T::w|| <'+||':':glloo':'N'S'STZ'['a'a'c#'DII48IIM4?4G4M0;0Ct
 !'',,*E*E',,//!8#'<<#6#6',,//#6#J#O#OPV#W#]#]#_D#		04		 "("6"67Gd"6"STO #GXe"f ,,XDK[]pJq,rJ??DD>!{ " " % $  ) @,7,?4M@  ) ! !   	)1-CD<< 	s   CP AO 1P 4	P >A"O  AP 4B*O$ P O$ *P +O$ 6P 7AP ?A4O? 3AP 
OP OP 
O!P  O!!P $O<9P :P ;O<<P ?
P	P 
P PP 
PP PP 
Q)%QQQc                   >  UR                   (       au  [        UR                   S5      (       aZ  UR                   R                  (       a?  [        UR                   R                  S5      (       d  [	        SS0[
        R                  S9$ [        R                  " 5          [        TU ](  " U/UQ70 UD6sS S S 5        $ ! , (       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   addr   z(You do not have permission to add stampsr   zStampViewSet.createz&An error occurred while creating stamp)r   r   r   r   r   r   HTTP_403_FORBIDDENr   atomicsupercreaterM   r   r   r   r   r   r   r   	__class__s        rU   r   StampViewSet.create   s    	||d ; ;-glloouEE# "LM%88 
 ##%w~g??? &%% 	+Q/BC<< 	B   BC 	C B<2	C <
C
C 
C 
D%D<DDc                    UR                  S5      nU(       d  [        SS0[        R                  S9$ [	        U5      R                  5       R                  5       n/ SQnXV;   a  [        SSU S30[        R                  S9$ Sn[        R                  " Xu[        R                  5      (       d  [        SSU S	30[        R                  S9$  [        R                  R                  US
9n Sn	 UR                  (       a  [        UR                  S5      (       a  UR                  R                   n
U
(       a   [        UR                  S5      (       a  UR                  R"                  (       a  SSKJn  UR                  R)                  UR                  R"                  S9R+                  S5      R-                  5       nU(       a  UR                   (       a  UR                   n	OU
=(       d    Sn	OU
=(       d    Sn	OOUR                  (       a  [        UR                  S5      (       a  UR                  R"                  (       au   SSKJn  UR                  R)                  UR                  R"                  S9R+                  S5      R-                  5       nU(       a  UR                   (       a  UR                   n	0 nUR0                  (       a/  [3        UR0                  /U	5      nU(       a  UnOUR0                  S 0nU R5                  USU0S9n[        UR6                  5      $ ! [        R                   a    [        SS0[        R                  S9s $ f = f! [.         a    U
=(       d    Sn	 Nf = f! [.         a     Nf = f! [.         a     Nf = f! [.         a0  n[9        SU5        [        SS0[        R:                  S9s S nA$ S nAff = f)Npkr   zStamp ID is requiredr   )	permissionszworktime-reportztodays-progresszmonthly-balancezbalance-screenzapprove-dayzcancel-approval-dayexcelpdf'z' is not a valid stamp IDz>^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$z' is not a valid UUID format)r   zStamp not foundr?   r   r   r   r%   r   r   )r   zStampViewSet.retrievez.An error occurred while fetching stamp details)r   r   r   HTTP_400_BAD_REQUESTrN   striplowerHTTP_404_NOT_FOUNDrematch
IGNORECASEr   rH   DoesNotExistr   r   r   r   r   r&   rI   r   rK   rM   r   rV   r   r   r   r   )r   r   r   r   r   pk_strnon_uuid_routesuuid_patterninstancerP   r   r&   r   rQ   config_datar   r   s                    rU   retrieveStampViewSet.retrieve   s0   ZZ0122  R&&(b $AbT!:;<00  Yxxbmm<<AbT!=>?00 	}}((B(/H5	 M<<GGLL&$A$A"),,"3"3K"@&w||T::w|| <'+||':':glloo':'N'S'STZ'['a'a'c#'DII48IIM4?4G4M0;0Ct #  \\ggllD&A&Aglloo4#||22glloo2FKKFSYY[DII,0IIM #%&&BHD[D[C\^kl*5'+3+B+BD*I' ,,X@PRe?f,gJJOO,,k !! 	+,00 	2  ) @,7,?4M@ %  "  	-q1JK<< 	s   L  *N -A	M? 7B*M !N "M -N .M 9N ;AM? A4M/ 7A(N  .MMM,)M? *N +M,,M? /
M<9M? :N ;M<<M? ?
N	N NN 
O	%O>O	O	c                   >  UR                   (       au  [        UR                   S5      (       aZ  UR                   R                  (       a?  [        UR                   R                  S5      (       d  [	        SS0[
        R                  S9$ [        R                  " 5          [        TU ](  " U/UQ70 UD6sS S S 5        $ ! , (       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   editr   z)You do not have permission to edit stampsr   zStampViewSet.updatez&An error occurred while updating stamp)r   r   r   r   r   r   r   r   r   r   updaterM   r   r   r   s        rU   r   StampViewSet.updateZ  s    	||d ; ;-glloovFF# "MN%88 
 ##%w~g??? &%% 	+Q/BC<< 	r   c           	        >  UR                   (       au  [        UR                   S5      (       aZ  UR                   R                  (       a?  [        UR                   R                  S5      (       d  [	        SS0[
        R                  S9$ [        R                  " 5          U R                  5       nUR                  nUR                  n[        SUR                   SU SU 35        [        T
U ]8  " U/UQ70 UD6nU(       a  S	S
KJn  U" XV5        UsS S S 5        $ ! , (       d  f       g = f! ["         a>  n	[%        SU	5        [        SU	 35        [	        SS0[
        R&                  S9s S n	A	$ S n	A	ff = f)Nr   deleter   z+You do not have permission to delete stampsr   zDeleting stamp ID: z, User: z, Date: r   *calculate_daily_balances_for_user_and_datezStampViewSet.destroyzError in destroy: z&An error occurred while deleting stamp)r   r   r   r   r   r   r   r   r   
get_objectr~   r   printr   destroyrq   r   rM   r   r   )r   r   r   r   r   r~   
stamp_dateresponser   r   r   s             rU   r   StampViewSet.destroym  s1    	||d ; ;-gllooxHH# "OP%88 
 ##%??,"**%]]
+HKK=	R\Q]^_ !7?7DTDVD b>wS! &%%"  	,a0&qc*+BC<< 	sC   BD* 	D* A1D	D* 
D'#D* 'D* *
E243E-'E2-E2 )__name__
__module____qualname____firstlineno__r   serializer_classr   r   r   r   r   r   __static_attributes____classcell__)r   s   @rU   r   r      s0    &:Zx&]~&! !rb   r   POSTc                     U R                   R                  S5      nU R                   R                  S5      nU(       d  [        SS0[        R                  S9$ U(       d  [        SS0[        R                  S9$  [
        R                  " US5      R                  5       n[        R                  R                  XS	9nUR                  5       (       d  [        SS
0[        R                  S9$ UR                  SS9nSnUS:  a   SSKJn  U" X5        SU S3UUUS.n	U(       a  SU 3U	S'   [        U	[        R(                  S9$ ! [         a    [        SS0[        R                  S9s $ f = f! ["         a!  n[%        SU5        ['        U5      n SnANSnAff = f! ["         ac  n
[%        SU
5        SSKn['        U
5      nUR-                  5       n[/        SU SU 35        [        SSU 30[        R0                  S9s Sn
A
$ Sn
A
ff = f)zo
Approve all stamps for a user on a specific date
Request body: { user_id: string, date: string (YYYY-MM-DD) }
r~   r   r   user_id is requiredr   date is requiredr   #Invalid date format. Use YYYY-MM-DDr~   r   *No stamps found for this user on this dateANr   r   zapprove_day balance_calculationzSuccessfully approved 	 stamp(s)messager~   r   updated_countzBalance recalculation failed: warningapprove_dayzError in approve_day: 
z'An error occurred while approving day: )r   r   r   r   r   r   r   r   r   r   rH   rI   existsr   r   rq   r   rM   r   rN   HTTP_200_OK	traceback
format_excr   r   )r   r~   date_strr   stampsr   balance_errorr   	balance_eresponse_datar   r  error_detailstraceback_strs                 rU   r   r     s   H
,,""9-<<##F+/022 
 ,-22 	!**8Z@EEGJ %%g%G}}FG00  S1 1/^:7O 0iH*	
 )G'WM)$f.@.@AAQ  	?@22 	2  /;YG #I/"  
-#A!,,.&}oRGH?OP88
 	

sz   AF  F ;%E  AF ,F E. 1F $E+(F *E++F .
F8FF FF 
H	&AH>H	H	c                 .    U R                   R                  S5      nU R                   R                  S5      nU(       d  [        SS0[        R                  S9$ U(       d  [        SS0[        R                  S9$  [
        R                  " US5      R                  5       n[        R                  R                  XS	9nUR                  5       (       d  [        SS
0[        R                  S9$ UR                  SS9nUS:  a  SSKJn  U" X5        [        SU S3UUUS.[        R"                  S9$ ! [         a    [        SS0[        R                  S9s $ f = f! [$         a0  n['        SU5        [        SS0[        R(                  S9s SnA$ SnAff = f)z{
Cancel approval for all stamps for a user on a specific date
Request body: { user_id: string, date: string (YYYY-MM-DD) }
r~   r   r   r   r   r   r   r   r   r   rD   r   r   z#Successfully canceled approval for r   r   cancel_approval_dayz*An error occurred while canceling approvalN)r   r   r   r   r   r   r   r   r   r   rH   rI   r  r   r   rq   r   r  rM   r   r   )r   r~   r  r   r  r   r   r   s           rU   r  r    s   6
,,""9-<<##F+/022 
 ,-22 	!**8Z@EEGJ %%g%G}}FG00  R0 1Z6wK<]O9U*	

 $$& 	&/  	?@22 	<  
'+BC88
 	

sP   AE  E ;%D0  AE ,AE 0$EE EE 
F$%F	FFr   c                     U R                   R                  S5      nU(       d  [        SS0[        R                  S9$ [
        R                  " 5       R                  5       n[        R                  R                  [        U5      US9R                  5       nU[        UR                  5       S9-
  nU[        SS9-   n[        R                  R                  [        U5      XE/S9R                  S	5      n[!        S
 U 5       5      nU(       a  UR"                  OSnUS-  n	US-  n
Sn[%        X-  S-  S5      nUUR'                  S5      [)        U	S5      [)        U	S5      U[+        U5      S.UR'                  S5      UR'                  S5      [)        U
S5      [)        U
S5      U[)        US5      [-        S[)        X-
  S5      5      S.X:  UR/                  5       [)        U
[-        UR/                  5       S5      -  S5      S.S.n[        U5      $ ! [0         a0  n[3        SU5        [        SS0[        R4                  S9s SnA$ SnAff = f)zQ
Get today's progress data optimized for the progress card
Query params: user_id
r~   r   r   r   r   rg      r~   r   r   c              3   8   #    U  H  oR                   v   M     g 7fN)total_work_secondsrk   wbs     rU   rn   "todays_progress.<locals>.<genexpr>B  s     "S?R#8#8?   r   rY   g      D@d   r   r   )r   r_   
total_workr^   formatted_time)rm   r|   worked_hoursr  expected_hoursprogress_percentageremaining_hours)is_week_completedays_workedaverage_daily_hours)r~   todayweeksummarytodays_progressz1An error occurred while fetching today's progressN)query_paramsr   r   r   r   r   nowr   r   rH   rI   rN   rK   r   rj   order_byrr   r  minstrftimeroundra   maxcountrM   r   r   )r   r~   r"  todays_balancestart_of_weekend_of_weekweekly_balancestotal_weekly_secondstodays_secondstodays_hoursweekly_hoursexpected_weekly_hoursr  r	  r   s                  rU   r%  r%     sW   G
&&**95/022 
 ##% %,,33L 4 
 %' 	 	u}} ??#iQ&77 &--44L&4 5 
 (6
 	  #"S?"SS>L::RS &,+d2 $ "<#G3"NPST z2|Q/#L!4)"1."A ,44Z@'00< %lA 6#L!4"7',-@!'D#&q%0E0TVW*X#Y %1$I.446',\C@U@U@WYZ<[-[]^'_%
2 && 
#Q'IJ88
 	

s#   ;H GH 
I%I=IIc                 n  ^"  U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      n[        XU/5      (       d  [        SS0[        R
                  S9$  [        R                  " US5      R                  5       n[        R                  " US5      R                  5       n[        R                  R                  [        U5      XE/S	9R                  S
5      n[        R                  R                  UXE/S	9R                  S
S5      nSn U R                   (       a  [#        U R                   S5      (       a  U R                   R$                  n	U	(       a   [#        U R                   S5      (       a  U R                   R&                  (       a  SSKJn
  U
R                  R                  U R                   R&                  S9R-                  S5      R/                  5       nU(       a  UR$                  (       a  UR$                  nOU	=(       d    SnOU	=(       d    SnOOU R                   (       a  [#        U R                   S5      (       a  U R                   R&                  (       au   SSKJn
  U
R                  R                  U R                   R&                  S9R-                  S5      R/                  5       nU(       a  UR$                  (       a  UR$                  nUR3                  5       (       a%  [5        UR7                  SSS95      n[9        X5      nO0 n[;        S U 5       5      n0 nU H=  nUR                  R=                  S5      nUU;  a  / UU'   UU   R?                  U5        M?     / nUm"T"U::  Ga  T"R=                  S5      nT"R=                  S5      n[A        U"4S jU 5       S5      nUR                  U/ 5      n/ nU GH  nUR                  URB                  5      n[E        U[F        5      (       a6  UR                  S5      nUR                  SS5      nUR                  SS5      nOU(       a  UOSnSnSnUR?                  0 S[        UR&                  5      _SURB                  _SU_SU_SU_S URH                  _SURJ                  R=                  S!5      _S
UR                  R=                  S5      _SURL                  RO                  5       _S"URP                  (       a  URP                  RO                  5       OS_S#URR                  (       a  [        URR                  5      OS_S$UR                  =(       d    S_S%URT                  (       a  [        URT                  R&                  5      OS_S&URT                  (       a  [        URT                  R&                  5      OS_S'URT                  (       a  URT                  RV                  OS_S(URX                  (       a  [        URX                  R&                  5      OS_S)URX                  (       a  [        URX                  R&                  5      OS_URX                  (       a  URX                  RV                  OSURZ                  =(       d    SUR\                  =(       d    SS*.E5        GM     UU(       a  [_        UR`                  5      OS+U(       a  [_        URb                  5      OS+U(       a  [_        URd                  5      OS+U(       a  [_        URf                  5      OS+U(       a  [_        URh                  5      OS+U(       a  [_        URj                  5      OS+U(       a  [_        URl                  5      OS+U(       a  [_        URn                  5      OS+U(       a  [_        URp                  5      OS+U(       a  [_        URr                  5      OS+U(       a  URt                  S, OS-[w        U5      US..nUR?                  U5        T"[y        S/S09-  m"T"U::  a  GM  U[_        U5      U[w        U5      [w        U Vs/ s H  nUS1   S:  d  M  UPM     sn5      UR{                  5       [_        U5      S2.S3.n[        U5      $ ! [         a    [        SS0[        R
                  S9s $ f = f! [0         a    U	=(       d    Sn GNf = f! [0         a     GNf = f! [0         a     GNf = fs  snf ! [0         a0  n[}        S4U5        [        SS50[        R~                  S9s SnA$ SnAff = f)6z`
Get user monthly balance data with daily breakdown
Query params: user_id, start_date, end_date
r~   rm   r|   r   .user_id, start_date, and end_date are requiredr   r   r   r  r   timer?   r   r   r   r%   r   r   Tr   c              3   8   #    U  H  oR                   v   M     g 7fr  regular_work_secondsr  s     rU   rn   "monthly_balance.<locals>.<genexpr>  s     !RMb"9"9Mr  z%d-%m-%Yc              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7fr  r   )rk   r  r   s     rU   rn   r=    s      Wmww,?Vms   #	#NrE   rF   rD   rG   function_namefunction_iconfunction_colordescription%H:%M:%Sreturn_datework_idr   project
project_idproject_nametasktask_id)	task_namedurationsourcerX   .2fz0.00)r   regularr  daily_breaknet_workovertimeflexbank_creditedbank_debitedovertime_balancetoilvacation_days_accruedstamp_counttime_entriesr   rg   rY  )r   days_with_stampstotal_stampstotal_month_regular_hours)r~   total_month_regular	date_datar$  monthly_balancez0An error occurred while fetching monthly balance)@r&  r   r   r   r   r   r   r   r   r   r   rH   rI   rN   r(  r   r   r   r   r   r   r&   r   rK   rM   r  r   r   rV   rr   r*  appendnextr   
isinstancedictrB  r9  rm   	isoformatrD  rE  rF  namerI  rL  rM  ra   r<  r  daily_break_secondsnet_work_secondsovertime_secondsflex_secondsbank_credited_secondsbank_debited_secondsovertime_balance_secondstoil_secondsrX  lenr   r-  r   r   )#r   r~   rm   r|   r   r   work_balancesr  rP   r   r&   r   rO   rQ   r^  stamps_by_datestampr  r_  formatted_datework_balance
day_stampsrZ  r   r?  r@  rA  day_datadr	  r   get_configuration_visibilityanalyze_current_statesshould_configuration_be_visibler   s#                                     @rU   r`  r`  o  s   t
&&**95))--l;
''++J7G233JK22 	%..z:FKKMN#,,XzBGGIL $++22L'6 3 
 (6
 	 %%'6 & 
 (66
" 	 	||f = =%ll//<"7<<667<<??8#'<<#6#6',,//#6#J#O#OPV#W#]#]#_D#		04		0;0Ct,7,?4M   '',,"="=',,//0<<..',,//.BGGOUUWD		(,		 ==??!&"4"45ED"4"QRO"F"f"$
 "!RM!RR Ezz**:6H~-+-x(8$++E2	  	%l*#,,Z8H)22:>N   Wm WY]^L (++Hb9J L#155e6J6JKk400$/OOH$=M$/OOFB$?M%0__Wb%AN3>KDM$&M%'N## %#ehh-%$e&:&:% $]% $]	%
 %n% "5#4#4% EJJ//
;% EJJ//
;% !%"2"2"<"<">% "EDUDU5#4#4#>#>#@[_% U]]s5==1% ell0b% s5==#3#344% !5==#emm&6&6"7d% #%--EMM$6$6T%  %**C

.$!%" UZZs5::==1T#%$ 5:JJD % 6$#ll2d)%  $L 'Q]?<+L+LMcjR^ol.M.MNdkT`|/O/OPfmNZOL,I,IJ`gNZOL,I,IJ`gFR(A(ABX_Xd1S1S!TjqVb0Q0Q Rho^jOL4Y4Y$ZpwFR(A(ABX_XdL,N,Ns+Sjp": ,H" X&I1--LG l*N #23F#G"!)n$'I(VIq=AQTUAUI(V$W &-<=P-Q		

 &&}  	?@22 	H % <(3(;t< !  		P )W  
#Q'HI88
 	

s   A<c: A
b A(c: 4A	c$ >B*b7 (c: )b7 4c: 5b7  c: Ac$ 
A4c >T'c: (c: c5c5.c: $b41c: 3b44c: 7cc$ c: cc$ 
c!c$ c:  c!!c$ $
c2.c: 1c22c: :
d4%d/)d4/d4c                 ~6  ^@^A^B  U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  SS5      n[        XU/5      (       d  [        SS0[        R
                  S9$  [        R                  " US	5      R                  5       n[        R                  " US	5      R                  5       n[        R                  R                  [        U5      XV/S9R                  S5      n[        R                  R                  [        U5      US9R                  S5      m@SSKJn  U" U5      n	["        R                  R                  S5      R%                  5       n
['        XVX5      n[(        R                  R                  UXV/S9R+                  SS5      R                  SS5      n[(        R                  R                  UUS9R+                  SS5      R                  SS5      n[,        R                  R                  UXV/S9R                  SS5      nSnU R.                  (       a:  [1        U R.                  S5      (       a  U R.                  R2                  =(       d    SnUR5                  5       (       a&  [7        UR9                  SSS95      n[;        UU5      nO0 n[=        S U 5       5      n[=        S U 5       5      n[=        S U 5       5      n[=        S U 5       5      n[=        S U 5       5      n[=        S U 5       5      n[=        S  U 5       5      nUU-
  n[=        S! T@ 5       5      n[=        S" T@ 5       5      n[=        S# T@ 5       5      n[=        S$ T@ 5       5      n[=        S% T@ 5       5      n[=        S& T@ 5       5      n[=        S' T@ 5       5      n UU-
  n!U
=(       a    U
R>                  S:  n"S(n#S(n$/ / / U"(       a  / O/ / / / / S).n%U@4S* jn&U GH  mAUR                  TAR                  S+9R                  S5      n'/ n(U' GH  n)U(RA                  U)RB                  RE                  S,5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S-5      O%UR                  U)RH                  U)RH                  5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S.5      OS/[G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S05      OS/U)RL                  =(       d    S1U)RH                  S2.5        GM     TARN                  S:w  Ga?  S3n*U	(       Ga  TAR                  RQ                  5       n+U+S4::  a  [S        U	S5S/5      (       a  [S        U	S6S/5      (       at  U	RT                  n,U	RV                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*GOGU+S7:X  a  [S        U	S8S/5      (       a  [S        U	S9S/5      (       as  U	R^                  n,U	R`                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*OU+S::X  a  [S        U	S;S/5      (       a  [S        U	S<S/5      (       as  U	Rb                  n,U	Rd                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*O[S        U	S=S35      n*TARf                  S>-  n.U*S>-  n/TARN                  S>-  n0U&" TAR                  S?5      n1U%S?   RA                  TAR                  RE                  S	5      TAR                  RE                  S@5      [i        TARN                  S>-  SA5      TARN                  S:  a  SBOSCS1TARj                  Rl                  [i        TARn                  S>-  SA5      [i        TARp                  S>-  SA5      [i        TARN                  S>-  SA5      [i        U1S>-  SA5      SDU.SE SF3U/SE SF3U0SE SF3U.SE SGU/SE SHU0SE SF3SI.U(SJ.5        TARp                  S:w  Ga?  U&" TAR                  SK5      n2S3n*U	(       Ga  TAR                  RQ                  5       n+U+S4::  a  [S        U	S5S/5      (       a  [S        U	S6S/5      (       at  U	RT                  n,U	RV                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*GOGU+S7:X  a  [S        U	S8S/5      (       a  [S        U	S9S/5      (       as  U	R^                  n,U	R`                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*OU+S::X  a  [S        U	S;S/5      (       a  [S        U	S<S/5      (       as  U	Rb                  n,U	Rd                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*O[S        U	S=S35      n*TARf                  S>-  n.U*S>-  n/TARp                  S>-  n3U%SK   RA                  TAR                  RE                  S	5      TAR                  RE                  S@5      [i        TARp                  S>-  SA5      TARp                  S:  a  SBOSCS1TARj                  Rl                  [i        TARn                  S>-  SA5      [i        TARp                  S>-  SA5      [i        TARN                  S>-  SA5      [i        U2S>-  SA5      SDU.SE SF3U/SE SF3U3SE SF3U.SE SGU/SE SHU3SE SF3SI.U(SJ.5        TARr                  S:w  Ga?  U&" TAR                  SL5      n4S3n*U	(       Ga  TAR                  RQ                  5       n+U+S4::  a  [S        U	S5S/5      (       a  [S        U	S6S/5      (       at  U	RT                  n,U	RV                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*GOGU+S7:X  a  [S        U	S8S/5      (       a  [S        U	S9S/5      (       as  U	R^                  n,U	R`                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*OU+S::X  a  [S        U	S;S/5      (       a  [S        U	S<S/5      (       as  U	Rb                  n,U	Rd                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*O[S        U	S=S35      n*TARf                  S>-  n.U*S>-  n/TARr                  S>-  n5U%SL   RA                  TAR                  RE                  S	5      TAR                  RE                  S@5      [i        TARr                  S>-  SA5      TARr                  S:  a  SBOSCS1TARj                  Rl                  [i        TARn                  S>-  SA5      [i        TARp                  S>-  SA5      [i        TARN                  S>-  SA5      [i        U4S>-  SA5      SDU.SE SF3U/SE SF3U5SE SF3U.SE SGU/SE SHU5SE SF3SI.U(SJ.5        GM     U GH  mB[w        TBRt                  5      S:w  d  M  UR                  TBR                  S+9R                  S5      n'/ n(U' GH  n)U(RA                  U)RB                  RE                  S,5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S-5      O%UR                  U)RH                  U)RH                  5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S.5      OS/[G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S05      OS/U)RL                  =(       d    S1U)RH                  S2.5        GM     [=        UB4ST jT@ 5       5      n6[i        [w        TBRt                  5      SA5      n7[i        U6SA5      n8U%SM   RA                  TBR                  RE                  S	5      TBR                  RE                  S@5      U7U7SNS1SU[i        TBRn                  S>-  SA5      [i        TBRp                  S>-  SA5      [i        TBRN                  S>-  SA5      U8U8SOU7SP SQ3SVSRU7SP SQ3SS.U(SW.5        GM     U GH  mATARx                  S:  Gar  UR                  TAR                  S+9R                  S5      n'/ n(U' GH  n)U(RA                  U)RB                  RE                  S,5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S-5      O%UR                  U)RH                  U)RH                  5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S.5      OS/[G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S05      OS/U)RL                  =(       d    S1U)RH                  S2.5        GM     S3n*U	(       Ga  TAR                  RQ                  5       n+U+S4::  a  [S        U	S5S/5      (       a  [S        U	S6S/5      (       at  U	RT                  n,U	RV                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*GOGU+S7:X  a  [S        U	S8S/5      (       a  [S        U	S9S/5      (       as  U	R^                  n,U	R`                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*OU+S::X  a  [S        U	S;S/5      (       a  [S        U	S<S/5      (       as  U	Rb                  n,U	Rd                  n-[Y        [        RZ                  " TAR                  U-5      [        RZ                  " TAR                  U,5      -
  R]                  5       5      n*O[S        U	S=S35      n*U&" TAR                  SX5      n9TARx                  S>-  n:U%SX   RA                  TAR                  RE                  S	5      TAR                  RE                  S@5      [i        TARx                  S>-  SA5      SYS1TARj                  Rl                  [i        U9S>-  SA5      SZU:SE SF3S[U:SE SF3S\.U(S].	5        TARz                  S:  d  GM  UR                  TAR                  S+9R                  S5      n'/ n(U' GH  n)U(RA                  U)RB                  RE                  S,5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S-5      O%UR                  U)RH                  U)RH                  5      [G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S.5      OS/[G        UR                  U)RH                  5      [J        5      (       a+  UR                  U)RH                  0 5      R                  S05      OS/U)RL                  =(       d    S1U)RH                  S2.5        GM     U&" TAR                  SX5      n9TARz                  S>-  n;U%SX   RA                  TAR                  RE                  S	5      TAR                  RE                  S@5      [i        TARz                  S>-  SA5      * S^S_TARj                  Rl                   3TARj                  Rl                  [i        U9S>-  SA5      S`U;SE SF3SaU;SE SF3Sb.U(S].	5        GM     U% H  n<U%U<   R}                  Sc SSd9  M     S?[i        US>-  SA5      S[i        US>-  SA5      SeSf.SK[i        US>-  SA5      S[i        US>-  SA5      SgSf.SM[i        U SA5      SSShSf.SiSSSSjSf.SkSSSSlSf.SmSSSSnSf.SL[i        US>-  SA5      S[i        US>-  SA5      SeSf.SX[i        U!S>-  SA5      SSSoSf./n=UUUUU=U%Xe-
  R~                  Sp-   UR                  5       [i        US>-  SA5      [i        US>-  SA5      [i        US>-  SA5      [i        US>-  SA5      [i        US>-  SA5      U	S/LSq.Sr.n>[        U>5      $ ! [         a    [        SS
0[        R
                  S9s $ f = f! [         a0  n?[        SSs[        U?5       30[        R                  S9s S/n?A?$ S/n?A?ff = f)tz
Get comprehensive balance data for the balance screen
Combines WorkBalance totals with BalanceDetail breakdowns by paycode
Query params: user_id, start_date, end_date, period_type (week/month)
r~   rm   r|   period_typer#  r   r8  r   r   r   r  r   )r~   	date__lter   rd   z-created_atpaycodert  paycode__namer9  r?   r   r   Tr   c              3   8   #    U  H  oR                   v   M     g 7fr  r;  r  s     rU   rn   &balance_screen_data.<locals>.<genexpr>  s     Lm33mr  c              3   8   #    U  H  oR                   v   M     g 7fr  ri  r  s     rU   rn   r    s     I=R00=r  c              3   8   #    U  H  oR                   v   M     g 7fr  rj  r  s     rU   rn   r         A=R=r  c              3   8   #    U  H  oR                   v   M     g 7fr  rk  r  s     rU   rn   r    s     !S]r":":]r  c              3   8   #    U  H  oR                   v   M     g 7fr  rl  r  s     rU   rn   r    s      Q=R!8!8=r  c              3   8   #    U  H  oR                   v   M     g 7fr  rn  r  s     rU   rn   r    r  r  c              3   L   #    U  H  n[        UR                  5      v   M     g 7fr  floatrX  r  s     rU   rn   r    s     $]}U2+C+C%D%D}   "$c              3   8   #    U  H  oR                   v   M     g 7fr  r;  r  s     rU   rn   r    s     &bIa2'>'>Iar  c              3   8   #    U  H  oR                   v   M     g 7fr  r  r  s     rU   rn   r    s     '_F^(;(;F^r  c              3   8   #    U  H  oR                   v   M     g 7fr  r  r  s     rU   rn   r         #W>VOO>Vr  c              3   8   #    U  H  oR                   v   M     g 7fr  r  r  s     rU   rn   r    s     ,iPh"-E-EPhr  c              3   8   #    U  H  oR                   v   M     g 7fr  r  r  s     rU   rn   r    s     +gNf,C,CNfr  c              3   8   #    U  H  oR                   v   M     g 7fr  r  r  s     rU   rn   r    r  r  c              3   L   #    U  H  n[        UR                  5      v   M     g 7fr  r  r  s     rU   rn   r    s!     /sZrTVb6N6N0O0OZrr  F)
Flex HoursOvertimeVacation
Sick LeaveParental LeaveUnpaid Leave	Comp TimeWork Time Bankc                   >^  US:X  a  [        U 4S jT 5       5      $ US:X  a  [        U 4S jT 5       5      $ US:X  a  [        U 4S jT 5       5      $ US:X  a.  [        U 4S jT 5       5      n[        U 4S	 jT 5       5      nX#-
  $ g
)zHCalculate cumulative balance up to target_date for specific balance typer  c              3   ^   >#    U  H"  oR                   T::  d  M  UR                  v   M$     g 7fr  )r   rj  rk   r  target_dates     rU   rn   Qbalance_screen_data.<locals>.get_cumulative_balance_up_to_date.<locals>.<genexpr>  %     h5MrQXQX\gQg?2??5M   --r  c              3   ^   >#    U  H"  oR                   T::  d  M  UR                  v   M$     g 7fr  )r   ri  r  s     rU   rn   r    s(     l9Q2U\U\`kUk.2..9Qr  r  c              3   ^   >#    U  H"  oR                   T::  d  M  UR                  v   M$     g 7fr  )r   rn  r  s     rU   rn   r    r  r  r  c              3   ^   >#    U  H"  oR                   T::  d  M  UR                  v   M$     g 7fr  )r   rk  r  s     rU   rn   r    s(     uBZB^e^eit^t7r77BZr  c              3   ^   >#    U  H"  oR                   T::  d  M  UR                  v   M$     g 7fr  )r   rl  r  s     rU   rn   r    s(     s@X"\c\cgr\r5b55@Xr  r   )rr   )r  balance_typecrediteddebitedcumulative_work_balancess   `   rU   !get_cumulative_balance_up_to_date>balance_screen_data.<locals>.get_cumulative_balance_up_to_date
  s    |+h5Mhhh+l9Qlll,h5Mhhh!11uBZuus@Xss))rb   r   rC  rE   rF   NrG   rD   )r9  r?  r@  rA  rB  r   ip     rt   ru   ri   rv   rw   r  rx   ry   default_daily_secondsrY   r  z%A   EarnedUsedzTotal Work - Expected Hoursz.3fhzh - zh = )formular  r  resultexplanation)r   dayr_   typerB  r~  regular_hoursovertime_hours
flex_hourscumulativeBalancecalculationstamp_detailsr  r  r  AccruedzVacation accrual raterN  z dayszVacation accrual: )r  accrued_daysrM  r  c              3      >#    U  H5  oR                   TR                   ::  d  M  [        UR                  5      v   M7     g 7fr  )r   r  rX  )rk   wbalancer  s     rU   rn   r    sR       /[e}Ya  BO  BO  SU  SZ  SZ  BZ/TuX5S5S/T/Te}s
   A A WorkzVacation accrual)r   r  r_   rh   r  rB  r~  r  r  r  r  cumulativeBalanceDaysr  r  r  	DepositedzWork time bank depositzWork time bank: +)r  deposited_hoursr  )	r   r  r_   r  rB  r~  r  r  r  	WithdrawnzWork time withdrawn via zWork time bank withdrawalzWork time bank: -)r  withdrawn_hoursr  c                     U S   $ )Nr   r   )xs    rU   <lambda>%balance_screen_data.<locals>.<lambda>i  s    qyrb   )keyreversegreen)r  balancetargetworkedrG   slategrayr  stoner  zincr  neutralbluer   )r   days_with_datatotal_regular_hourstotal_overtime_hourstotal_flex_hourswork_time_bank_balancer  working_policy_applied)r~   r|  rm   r|   balancestransaction_historyr$  zFailed to fetch balance data: )Cr&  r   r   r   r   r   r   r   r   r   r   rH   rI   rN   r(  rq   re   r   rK   r   r   r   r   r   r   r   r  r   r   rV   rr   self_certification_daysra  r9  r*  rc  r   rd  rB  rj  rj   getattrrt   ru   r]   rz   r{   rv   rw   rx   ry   r  r+  r~  rf  r<  ri  rn  rX  r  rk  rl  sortrh   r-  rM   r   )Cr   r~   rm   r|   r|  r   r   rp  re   r}   vacation_policyexpected_hours_secondsbalance_detailscumulative_balance_detailsr  rP   rO   rQ   total_regulartotal_overtime
total_flextotal_bank_creditedtotal_bank_debited
total_toiltotal_vacation_accruedr  cumulative_total_regularcumulative_total_overtimecumulative_total_flexcumulative_total_bank_creditedcumulative_total_bank_debitedcumulative_total_toil!cumulative_total_vacation_accrued!cumulative_work_time_bank_balancetrack_sick_leavetrack_parental_leavetrack_unpaid_leavebalance_type_transactionsr  ru  r  rr  scheduled_work_secondsrj   startendtotal_work_hoursr  r  cumulative_flex_secondscumulative_overtime_secondsr  cumulative_toil_seconds
toil_hourscumulative_vacation_daysvacation_dayscumulative_balance_dayscumulative_bank_secondsbank_credited_hoursbank_debited_hoursr  r  r	  r   r  detailr  sC                                                                   @@@rU   balance_screen_datar    s   n
&&**95))--l;
''++J7**..}fEG233JK22 	%..z:FKKMN#,,XzBGGIL $++22L'6 3 
 (6
 	 $/#6#6#=#=L" $> $
 (6
 	! 	F27; )0099-HNNP "B."

 (//66'6 7 
 .N
3HHV_4U 	 &3%:%:%A%A" &B &
 .N
3HHV_4U 	# %%'6 & 
 (66
" 	 <<GGLL&99#LL--5M ==??!&"4"45ED"4"QRO"FXe"f"$ LmLLI=IIA=AA
!!S]!SS  Q= QQA=AA
!$$]}$]!] "57I!I $'&bIa&b#b $''_F^'_$_! ##W>V#W W),,iPh,i)i&(++gNf+g(g% ##W>V#W W,//sZr/s,s) -KMj,j) +Z/V/VYZ/Z$"  0"b  	%
!	 &FFKK8AA&IJ M#$$!JJ//
;hr  tG  tK  tK  LQ  L`  L`  ta  cg  ih  ih%8%<%<U=Q=QSU%V%Z%Z[c%d  nA  nE  nE  FK  FZ  FZ  \a  \p  \p  nqfp  rE  rI  rI  JO  J^  J^  r_  ae  gf  gf%8%<%<U=Q=QSU%V%Z%Z[a%b  lphr  tG  tK  tK  LQ  L`  L`  ta  cg  ih  ih&9&=&=e>R>RTV&W&[&[\c&d  nr#(#4#4#:&+&:&:&  $ ""a')1&!$kk113G!|@UW[(\(\ahiw  zM  OS  bT  bT . B B,>>14h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'.BRTX*Y*Y^eft  wE  GK  _L  _L . = =,9914h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'..RV*W*W\cdr  uA  CG  ]H  ]H . ; ;,7714h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R.18I`bj1k. $*#<#<t#C !7$!>#0047
 +LFKKYe*f'),7>>"KK00<!;;//5"6#6#6#=qA(.(;(;a(?HV#%%~~22%*6+F+F+Mq%Q&+F,C,Cd,JA&N"'(;(;d(BA"F)./F/Mq)Q#@)9#(>a&@-;C,@*B%/$4A"6*:3)?tNSVCWW[\fgj[kkl'm$ &3%@ , &&!+.OPVP[P[]g.h+ *2&!$kk113G!|@UW[(\(\ahiw  zM  OS  bT  bT . B B,>>14h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'.BRTX*Y*Y^eft  wE  GK  _L  _L . = =,9914h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'..RV*W*W\cdr  uA  CG  ]H  ]H . ; ;,7714h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R.18I`bj1k. $*#<#<t#C !7$!>!'!8!84!?)*5<<"KK00<!;;//5"6#:#:T#A1E(.(?(?!(CH#%%~~22%*6+F+F+Mq%Q&+F,C,Cd,JA&N"'(;(;d(BA"F)./JT/QST)U#@)9#(>a&@-;C,@*B%3C$8":*:3)?tNSVCWW[\jkn[oop'q$ &3%> , ""a'*KFKKYd*e' *2&!$kk113G!|@UW[(\(\ahiw  zM  OS  bT  bT . B B,>>14h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'.BRTX*Y*Y^eft  wE  GK  _L  _L . = =,9914h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'..RV*W*W\cdr  uA  CG  ]H  ]H . ; ;,7714h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R.18I`bj1k. $*#<#<t#C !7$!>#0047
)+6=="KK00<!;;//5"6#6#6#=qA(.(;(;a(?HV#%%~~22%*6+F+F+Mq%Q&+F,C,Cd,JA&N"'(;(;d(BA"F)./F/Mq)Q#@)9#(>a&@-;C,@*B%/$4A"6*:3)?tNSVCWW[\fgj[kkl'm$ &3%? 0 S &D  BR--.!3#]]]8AA&I
 !#'E!(( %

 3 3J ?lv  xK  xO  xO  PU  Pd  Pd  xe  gk  ml  ml)<)@)@AUAUWY)Z)^)^_g)h  rE  rI  rI  JO  J^  J^  `e  `t  `t  rufp  rE  rI  rI  JO  J^  J^  r_  ae  gf  gf%8%<%<U=Q=QSU%V%Z%Z[a%b  lphr  tG  tK  tK  LQ  L`  L`  ta  cg  ih  ih&9&=&=e>R>RTV&W&[&[\c&d  nr','8'8'>B*/*>*>*  ( ,/  /[e}  /[  ,[( !&eB,D,D&Eq I*/0H!*L')*5<<GG,,Z877++D1*)%#%%%*2+B+BT+I1%M&+B,?,?$,F&J"'$(>"B)@-D#:+8*=U(C"4);M#;Ne'T	$ &3'> 1  ^ &F++a/#]]]<EEfM
 !#'E!(( %

 3 3J ?lv  xK  xO  xO  PU  Pd  Pd  xe  gk  ml  ml)<)@)@AUAUWY)Z)^)^_g)h  rE  rI  rI  JO  J^  J^  `e  `t  `t  rufp  rE  rI  rI  JO  J^  J^  r_  ae  gf  gf%8%<%<U=Q=QSU%V%Z%Z[a%b  lphr  tG  tK  tK  LQ  L`  L`  ta  cg  ih  ih&9&=&=e>R>RTV&W&[&[\c&d  nr','8'8'>B*/*>*>*  ( *2&!$kk113G!|@UW[(\(\ahiw  zM  OS  bT  bT . B B,>>14h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'.BRTX*Y*Y^eft  wE  GK  _L  _L . = =,9914h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R. A'..RV*W*W\cdr  uA  CG  ]H  ]H . ; ;,7714h6F6Fv{{TW6X[c[k[klrlwlwy~[6  6O  6O  6Q  2R.18I`bj1k. +LFKKYi*j' '-&B&BT&I#)*:;BB"KK00<!;;//5"6#?#?$#FJ'#%%~~22)./F/Mq)Q#;.A#-Fa+H):;Ns:SST'U$
 &3D  **Q.#]]]<EEfM
 !#'E!(( %

 3 3J ?lv  xK  xO  xO  PU  Pd  Pd  xe  gk  ml  ml)<)@)@AUAUWY)Z)^)^_g)h  rE  rI  rI  JO  J^  J^  `e  `t  `t  rufp  rE  rI  rI  JO  J^  J^  r_  ae  gf  gf%8%<%<U=Q=QSU%V%Z%Z[a%b  lphr  tG  tK  tK  LQ  L`  L`  ta  cg  ih  ih&9&=&=e>R>RTV&W&[&[\c&d  nr','8'8'>B*/*>*>*  ( +LFKKYi*j'%+%@%@4%G")*:;BB"KK00<!;;//5#F$?$?$$FJJ'%=fnn>Q>Q=R#S%~~22)./F/Mq)Q#>.@-EQ+G):;Mc:RRS'T$
 &3D ] &~ 6L%l388=PZ^8_ 6 % !6!=qA
T 115  # !:T!A1E 5q9  # !BAF %  ) '" $ !6!=qA
T 115  ) !BT!I1Me9
z &$  #<+<BBQF"/"5"5"7',]T-A1'E(-nt.CQ(G$)*t*;Q$?*/0F0Mq*Q"'(>(Eq"I*8*D	
& &&q  	?@22 	t  
6s1vh?@88
 	

so   BAl A
Ak ){Al :Al \6Al \N?Al k$Ak?k<Al k>Ak?k?Al l
Al<l%Al7l1Al<l7Al<c                     U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      n[        R                  R	                  SSS	5      R                  5       nU(       a5   [        R                  " US
5      R                  5       nUR                  US9nU(       a5   [        R                  " US
5      R                  5       n	UR                  U	S9nU(       a  UR                  US9nU(       a  UR                  US9nU(       a"  UR                  [        US9[        US9-  5      nU(       a  UR                  US9nUR                  SS5      n
[        U
R                  SSS95      n[        US5      n[!        U
SSU0S9nUR"                  n[%        U
5       H~  u  nnUR&                  (       d  M  [)        UR&                  R*                  5      UR&                  R,                  UR&                  R.                  UR&                  R0                  S.X   S'   M     SSKJn  U" [6        5      n[%        U
5       H:  u  nnUR                  R9                  S
5      nUU   R;                  UX   S.5        M<     [7        UR=                  5       5      nU(       a  U Vs/ s H(  n[        R                  " US
5      R                  5       PM*     nn[?        U5      n[A        U5      n[B        R                  R                  UU/S9n0 nU H8  n[)        URD                  5      UR                  R9                  S
5      4nUUU'   M:     O0 n/ nSnSn[G        UR=                  5       SS9 GH;  n[        R                  " US
5      R                  5       n UU   n!U! V"s/ s H  n"U"S    PM
     n#n"U! V"s/ s H  n"U"S!   PM
     n$n"U" [6        5      n%[%        U#5       H  u  nnURD                  (       a  [)        URD                  5      OS"nUR&                  (       aO  UR&                  R,                  =(       d    S# S$UR&                  R.                  =(       d    S# 3RI                  5       OS%n&U&(       d)  UR&                  (       a  UR&                  R0                  OS%n&UU&4n'U%U'   R;                  UU$U   S.5        M     / n(Sn)[G        U%RK                  5       5       GH  u  u  nn&n*U* V"s/ s H  n"U"S    PM
     n+n"U* V"s/ s H  n"U"S!   PM
     n,n"S&n-Sn.UU4n/U/U;   a'  UU/   nURL                  n.[O        URL                  5      n-OU+ H  nURP                  (       d  M  [)        URP                  5      RS                  S'S#5      RI                  5       n0S(U0;   a  U0RU                  S(5      n1U1S   RW                  5       (       a  [Y        U1S   5      OSn2[[        U15      S):  a&  U1S)   RW                  5       (       a  [Y        U1S)   5      OSn3U.U2S*-  U3S+-  -   -  n.M   []        U05      n4U.[Y        U4S*-  5      -  n.M     [O        U.5      n-U)U.-  n)U(R;                  UU&U-[[        U+5      U,S,.5        GM     [O        U)5      n5UU)-  nU[[        U#5      -  nUR;                  UU5[[        U#5      U(S-.5        GM>     [O        U5      n6US*-  n7US*-  S+-  n8U
R_                  SS.S/S05      Ra                  5       n9U
R                  S1S29R_                  SS3S45      Ra                  5       n:U
R                  [        S1S59[        S1S69-  5      R_                  S7S8S95      Ra                  5       n;U
R_                  S5      Rc                  [e        S:5      S;9n<SSSS<.n=U< H1  n>U>S   S=:X  a
  U>S>   U=S?'   M  U>S   S@:X  a
  U>S>   U=SA'   M)  U>S>   U=SB'   M3     [g        UUUU7U8U6U=U9Ri                  5       U:Ri                  5       U;Ri                  5       SC.UUUUUUSD.SE.5      $ ! [         a     GNnf = f! [         a     GNCf = fs  snf s  sn"f s  sn"f s  sn"f s  sn"f ! [         a     GM  f = f! [j         a0  n?[m        SFU?5        [g        SGSH0[n        Rp                  S9s SIn?A?$ SIn?A?ff = f)Jz|
Generate worktime report with all stamp details
Query params: start_date, end_date, user_id, project_id, client_id, status
rm   r|   r~   rG  	client_idr   r   rF  rI  r   	date__gter}  r   rG  project__customer_idproject__clientr   -dater9  r   Tr   r?   r   r   )r   	firstnamelastnameemailr   )defaultdict)rr  
stamp_datar   r  rr  r  unknownrD    UnknownrX   hrsr\   r   rY   rZ   )r~   employee_namer  rY  r  )r   r  rY  	employeesuser__firstnameuser__lastnameuser__emailF)project__isnullproject__nameproject__code)project__customer__isnull)project__client__isnullr  project__customer__namer  r   )r-  )approvedpending	suspendedr   r-  r/  Sr1  r0  )r\  total_hourstotal_minutestotal_hours_formattedstatus_summaryunique_users_countunique_projects_countunique_clients_count)rm   r|   r~   rG  r  r   )r  grouped_by_dater$  filtersworktime_reportr   z2An error occurred while generating worktime reportN)9r&  r   r   rH   r   r   r   r   r   rI   r   r    r(  r   r   rV   r   r   	enumerater   rN   r   r  r  r  collectionsr  r   r*  ra  keysr)  r,  r   r~   sortedr   itemsr  ra   rL  replacesplitisdigitr]   ro  r  valuesdistinctannotater"   r   r-  rM   r   r   r   )@r   rm   r|   r~   rG  r  status_filterr   r   r   r  rO   rQ   r   r  rl   rr  r  rq  date_key	date_listrw  date_objectsmin_datemax_daterp  work_balance_mapr  r  r:  r\  r  date_objday_stamps_infoinforu  day_stamp_dataemployee_groupsr$  employee_keyemployees_dataday_total_secondsemp_stamps_info
emp_stampsemp_stamp_dataemp_total_workemp_total_secondswb_keyduration_strpartsr_   r`   decimal_hoursday_total_workr5  r3  r4  unique_usersunique_projectsunique_clientsstatus_countsr6  itemr   s@                                                                   rU   r<  r<    s   m
))--l;
''++J7&&**95))--l;
((,,[9	,,00: ==//	6JNNP !)!2!2:z!J!O!O!Q#??^?D '00:FKKM#??\?B w7H*=H  y1Ai4PPH
 m<H ""7F3 f001A0MNB?TXY %V$AQSf@gh
__
 "&)HAuzzzejjmm,!&!5!5 %

 3 3"ZZ--	)
f% * 	,$T*!&)HAuzz**:6H8$++(m-  * ,,./	MVWYH--a<AACYLW<(H<(H (//66%x0 7 M
  "#2::(8(8(DE(* % $  " ~224dCH((:>CCEH,X6O4CDOD$w-OJD=LM_Td<0_NM *$/O%j1505#emm,9glgqgq5::#7#7#=2">a

@S@S@YWY?Z [ a a c  xA$8=

EJJ$4$4	M '7-44""0"36  2  N !=CODYDYD[=\9(-/8GHd7m
HAP!Q$|"4!Q ")$%! "8,--)&1B(*(=(=%%4R5J5J%KN ", >>>+.u~~+>+F+Fub+Q+W+W+YL"l2(4(:(:3(?9>q9I9I9K9KE!HQR;>u:>eTUhN^N^N`N`#eAh-fg 1edlwQS|5T T 1!)49,4GM$5]T=Q9R$R$5 ", &55F%GN!%66!%%&%2"0#&z?,' E >]V -->?N"33C
O+L"" ,":+	$ M D\ !00B C(D0+d2r9 }}Y0ACSUbclln --->EElTcetu~~  A.51QQ

&"%
 (* 	 h/88uT{8K

 "DH~$-1']z*h3&.27m{+,0My) "  . ,*!.)>"0&2&8&8&:)8)>)>)@(6(<(<(>	 )$"(&'
  	C    n X2 EM( I!Q4 (2 !)$(!)`  
#Q'JK88
 	

s   Cb= 4a0 b= 4b Cb= *C(b= /bC
b= bb=  b/D&b= b!$b= *b&9Ab= B9b= b+Gb= 0
a>:b= =a>>b= 
bb= bb= +
b:	5b= 9b:	:b= =
c7%c2,c72c7c           
          U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      n[        R                  R	                  SSS	5      R                  5       nU(       a5   [        R                  " US
5      R                  5       nUR                  US9nU(       a5   [        R                  " US
5      R                  5       n	UR                  U	S9nU(       a  UR                  US9nU(       a  UR                  US9nU(       a"  UR                  [        US9[        US9-  5      nU(       a  UR                  US9nUR                  SS5      n
[        U
R                  SSS95      n[        US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        [5        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/ S.Qn[9        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        [5        S&S&S'9Ul        MC     US--  n0 nU
 GH  nUR                  RA                  S
5      nUU;  a  0 UU'   URB                  (       a  [E        URB                  5      OS0nURF                  (       aO  URF                  RH                  =(       d    S1 S2URF                  RJ                  =(       d    S1 3RM                  5       OS3nU(       d)  URF                  (       a  URF                  RN                  OS3nUUU   ;  a  U/ S4.UU   U'   UU   U   S5   RQ                  U5        GM     [S        URU                  5       SS69 GH  n[        R                  " US
5      R                  5       nURA                  S
5      n[S        UU   RW                  5       5       GH  u  nnUR/                  S,U S7U 35        US,U 3   n U S8US9    3U l        [)        SS:S%9U l        ['        S;S;SS9U l        US--  nUS5    GH0  nURX                  S,:X  a  S<OURX                  S=:X  a  S>OS?n!URZ                  =(       d    S*n"URZ                  (       aS  URZ                  U;   aC  UURZ                     n#[]        U#[^        5      (       a  U#R                  S@URZ                  5      n"OU#n"UUR;                  US-S/9l        UR`                  (       a  UR`                  RA                  SA5      OS*UR;                  USBS/9l        US9   UR;                  US(S/9l        U"UR;                  USCS/9l        URb                  (       a  URb                  Rd                  OSDUR;                  USES/9l        URf                  (       a  URf                  Rd                  OSFUR;                  USGS/9l        URh                  =(       d    S*UR;                  USHS/9l        URj                  =(       d    S*UR;                  USIS/9l        U!UR;                  USJS/9l        [m        S-SK5       H  nUUR;                  UUS/9l        M     US--  nGM3     US--  nGM     GM     [m        S-SK5       H  nSLn$[o        U5      n%UU%    HF  n [q        [E        UR0                  5      5      U$:  a   [q        [E        UR0                  5      5      n$MF  MH     [s        U$SB-   SM5      n&U&URt                  U%   l;        M     [y        SNSO9n'SPU=(       d    SQ SRU=(       d    SQ SS3n(STU( SU3U'SV'   UR{                  U'5        U'$ ! [         a     GNf = f! [         a     GNf = f!    M  = f! [|         a0  n)[        SWU)5        [        SXSY0[X        R                  S9s SZn)A)$ SZn)A)ff = f)[zs
Generate worktime report as Excel file
Query params: start_date, end_date, user_id, project_id, client_id, status
rm   r|   r~   rG  r  r   r   rF  rI  r   r  r  r   r  r  r  r   r  r9  r   Tr   r?   Worktime Report366092solid)start_color	end_color	fill_typeFFFFFF   )boldrG   sizethin)style)leftrighttopbottomzA1:I1A1   )ro  rp  center)
horizontalvertical   Date Range: N/A to r   r   )	DateTimeEmployeer   r'   TaskDurationDescriptionStatus)rowcolumnr   rD   r!  r"  r$  r  r  r  z:Iz - r$     D3D3D3Approvedr2  	SuspendedPendingrE   rC  r  r  
No Projectri   No Taskr     rp   	   
   r   2   zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetcontent_typeworktime_report_r   _z.xlsxattachment; filename=""Content-Dispositionworktime_report_excelr   z/An error occurred while generating Excel reportN)Br&  r   r   rH   r   r   r   r   r   rI   r   r    r(  r   r   rV   r*   activetitler-   r+   r.   r/   merge_cellsvaluefontr,   	alignmentr=  cellfillborderr*  r~   rN   r   r  r  r   r  ra  r@  r?  rA  r   r   rc  rd  r9  rF  rf  rI  rL  rB  rs   r0   ro  r)  column_dimensionswidthr)   saverM   r   r   r   )*r   rm   r|   r~   rG  r  rH  r   r   r   r  rO   rQ   r  wsheader_fillheader_fontr  
title_cellr  headerscolrE   r  rq  rr  rI  user_id_strr$  rO  rs  emp_data
emp_headerstatus_textr?  	func_data
max_lengthr  adjusted_widthr   filenamer   s*                                             rU   r  r    s   w
))--l;
''++J7&&**95))--l;
((,,[9	,,00: ==//	6JNNP !)!2!2:z!J!O!O!Q#??^?D '00:FKKM#??\?B w7H*=Hy1Ai4PPH m<H""7F3 f001A0MNB?TXY ZYY$ "h(V]^H2>F#V$6"f%	
 	wX
,
Dr2
(HxP
 *:+>*?tHDUPUCVWB3%yM1HCq s$Wa0KC77s37/DDJ#DI#DI DK&(XNDN 1 	q Ezz**:6H~-+-x(05#emm,9Kchcmcmuzz339r:!EJJ<O<O<USU;VW]]_s|M 49JJ

 0 0I."::%2 9x(5
 8$[1(;BB5I! & ~224dCH((:>CCEH%..z:N)/x0H0N0N0P)Q%X3%r#/0!C5	]
&4%5S/9R8S#T
 "&Dr":
"-(hbi"j
q &h/E050C*Y^YeYeilYl+r{K %*$8$8$AEM++0D0DH[0[$78L8L$M	%i66,5MM(EDXDX,YM,5M7EBGGAG.4Z_ZdZduzz7J7J:7VjoBGGAG.47?7PBGGAG.47DBGGAG.4MR]]u}}7I7I`lBGGAG.4JO**uzzZcBGGAG.47<~~7NBGGAG.47<7H7H7QEBGGAG.47BBGGAG.4  %Q|>DC4;  , 1HC5 08 qM *R	 DZ B<CJ&s+F6
3tzz?+j8%(TZZ%9
 9 # !a4N1?B  (.    \
 &j&9E%:!H<M;NeT,B8*A*N&'
}    T  
)1-GH88
 	

s   C`> 4` `> 4`% X`> 'A `6'A,`> 
`"`> !`""`> %
`3/`> 2`33`> 6`;8`> >
a8%a3-a83a8c                 (    U R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      nU R                   R                  S5      n[        R                  R	                  SSS	5      R                  5       nU(       a5   [        R                  " US
5      R                  5       nUR                  US9nU(       a5   [        R                  " US
5      R                  5       n	UR                  U	S9nU(       a  UR                  US9nU(       a  UR                  US9nU(       a"  UR                  [        US9[        US9-  5      nU(       a  UR                  US9nUR                  SS5      n
[        U
R                  SSS95      n[        US5      n[         R"                  " 5       n[%        U[&        S[(        -  S[(        -  S9n/ n[+        5       n[-        SUS   S[.        R0                  " S5      SSS 9n[3        S!U5      nUR5                  U5        UR5                  [7        SS"[(        -  5      5        U(       d  U(       aZ  S#U=(       d    S$ S%U=(       d    S$ 3nUR5                  [3        UUS&   5      5        UR5                  [7        SS'[(        -  5      5        0 nU
 GH  nUR                  R9                  S
5      nUU;  a  0 UU'   UR:                  (       a  [=        UR:                  5      OS(nUR>                  (       aO  UR>                  R@                  =(       d    S) S*UR>                  RB                  =(       d    S) 3RE                  5       OS+nU(       d)  UR>                  (       a  UR>                  RF                  OS+nUUU   ;  a  U/ S,.UU   U'   UU   U   S-   R5                  U5        GM     [I        URK                  5       SS.9 GH6  n[        R                  " US
5      R                  5       nUR9                  S/5      n[-        S0US1   S2[.        R0                  " S5      S3S4S59nUR5                  [3        UU5      5        [I        UU   RM                  5       5       GH  u  nn[-        S6US7   S8[.        R0                  " S95      S:S3S59nUR5                  [3        S;US<    3U5      5        / S=Q/nUS-    GHG  nURN                  S>:X  a  S?OURN                  S@:X  a  SAOSBnURP                  =(       d    S$n URP                  (       aS  URP                  U;   aC  UURP                     n![S        U![T        5      (       a  U!R                  SCURP                  5      n OU!n UR5                  URV                  (       a  URV                  R9                  SD5      OS$U URX                  (       a  URX                  RZ                  OSEUR\                  (       a  UR\                  RZ                  OSFUR^                  =(       d    S$U/5        GMJ     [a        US[(        -  SG[(        -  SH[(        -  SG[(        -  S[(        -  SI[(        -  /SJ9n"U"Rc                  [e        SKSLSM[.        R0                  " S5      4SNSLSM[.        Rf                  4SOSPSQSRSKSSST[.        Rh                  4SUSLSTS[.        Rj                  4SV/	5      5        UR5                  U"5        UR5                  [7        SS"[(        -  5      5        GM     UR5                  [m        5       5        GM9     URo                  U5        [q        URs                  5       SWSX9n#SYU=(       d    SZ S[U=(       d    SZ S\3n$S]U$ S^3U#S_'   U#$ ! [         a     GNf = f! [         a     GNf = f! [t         a0  n%[w        S`U%5        [y        SaSb0[N        Rz                  S9s Scn%A%$ Scn%A%ff = f)dzq
Generate worktime report as PDF file
Query params: start_date, end_date, user_id, project_id, client_id, status
rm   r|   r~   rG  r  r   r   rF  rI  r   r  r  r   r  r  r  r   r  r9  r   Tr   r?   g      ?)pagesize	topMarginbottomMarginCustomTitleHeading1   z#366092   r   )parentfontSize	textColor
spaceAfterr  rg  g?r}  r~  r  Normalg?r   rD   r!  r"  r  r  r  z	%B %d, %Y
DateHeaderHeading2   r     )r  r  r  r  spaceBeforeEmployeeHeaderHeading3rn  z#666666ri   z
Employee: r$  )r  r   r'   r  r  r  r   r  r2  r  r  rE   rC  r  r  g333333?g      ?g?)	colWidths
BACKGROUNDr   r   r   	TEXTCOLOR)ALIGNr  r  r  LEFT)FONTNAMEr  r  zHelvetica-Bold)FONTSIZEr  r  r  )BOTTOMPADDINGr  r  rn  r   r   r  GRID)r  r  r  r  zapplication/pdfr  r  r   r  z.pdfr  r  r  worktime_report_pdfr   z-An error occurred while generating PDF reportN)>r&  r   r   rH   r   r   r   r   r   rI   r   r    r(  r   r   rV   ioBytesIOr4   r3   r<   r:   r;   r1   HexColorr7   ra  r8   r*  r~   rN   r   r  r  r   r  r@  r?  rA  r   r   rc  rd  r9  rF  rf  rI  rL  r5   setStyler6   
whitesmokebeigegreyr9   buildr)   getvaluerM   r   r   r   )&r   rm   r|   r~   rG  r  rH  r   r   r   r  rO   rQ   bufferdocelementsstylestitle_styler  filter_textrq  rr  rI  r  r$  rO  rs  
date_styler  	emp_style
table_datar  r?  r  tabler   r  r   s&                                         rU   r  r  |  s/   s
))--l;
''++J7&&**95))--l;
((,,[9	,,00: ==//	6JNNP !)!2!2:z!J!O!O!Q#??^?D '00:FKKM#??\?B w7H*=Hy1Ai4PPH m<H""7F3 f001A0MNB?TXY s4xVYZ^V^_$&$*%ooi0
 +[9q#d(+, ()<u(=T(BSeATUKOOIk6(3CDEOOF1c$h/0 Ezz**:6H~-+-x(05#emm,9Kchcmcmuzz339r:!EJJ<O<O<USU;VW]]_s|M 49JJ

 0 0I."::%2 9x(5
 8$[1(;BB5I! & ~224dCH((:>CCEH%..{;N (j) //)4J OOInjAB)/x0H0N0N0P)Q%X*$!*-$ooi8  "	 	Jx7P6Q*RT] ^_ \\
%h/E050C*Y^YeYeilYl+r{K %*$8$8$AEM++0D0DH[0[$78L8L$M	%i66,5MM(EDXDX,YM,5M%%;@::

++J75%.3mm**+0::

9/%#'  0, jQtVSXs4xQTUYQY[\]a[acfgkck4lmz!67FOOI4NO &'63D3DE7C5:!68V\\BVXq&++>5
+ 
  
 &q#d( 34g *Rj OOIK(I DN 			(   1@QR%j&9E%:!H<M;NdS,B8*A*N&'w    l  
'+EF88
 	

sg   C_ 4^5 _ 4_ Y)_ 5
_?_ __ 
__ __ 
`!%```c                     U R                   (       a6  [        U R                   S5      (       a  U R                   R                  (       d  [        SS0[        R
                  S9$ [        U R                   R                  5      n[        U[        R                  S9$ ! [         a0  n[        SU5        [        SS0[        R                  S9s SnA$ SnAff = f)zv
Get stamp permissions for the currently authenticated user.
Returns permissions based on the user's supervisor_code.
r   r   zUser not authenticatedr   get_user_stamp_permissions_viewz,An error occurred while fetching permissionsN)r   r   r   r   r   HTTP_401_UNAUTHORIZEDr   r  rM   r   r   )r   r   r   s      rU   r  r  :  s    
||77<<#>#>glloo2333 
 1AF,>,>?? 
3Q7DE88
 	

s$   A B #6B 
C$%C	CC)r?   r  )idjango.shortcutsr   rest_frameworkr   r   rest_framework.decoratorsr   r   r   rest_framework.permissionsr	   rest_framework.authenticationr
   rest_framework.responser   	django.dbr   django.db.modelsr   modelsr   serializersr   r   r   r   ErrorLogs.utilsr   functions.modelsr   worktimeservice.modelsr   configurations.modelsr   r   balancedetail.modelsr   paycode.modelsr   company.modelsr   r   r   r   r   django.utilsr   calendarr    r!   r"   r#   r$   r   r&   projects.modelsr'   clients.modelsr(   django.httpr)   openpyxlr*   openpyxl.stylesr+   r,   r-   r.   r/   openpyxl.utilsr0   reportlab.libr1   reportlab.lib.pagesizesr2   r3   reportlab.platypusr4   r5   r6   r7   r8   r9   reportlab.lib.stylesr:   r;   reportlab.lib.unitsr<   r  uuidr   rV   ra   r   ModelViewSetr   r   r  r%  r`  r  r<  r  r  r  r   rb   rU   <module>r     s   # + Z Z / ? , ! %  ( K % % . I . " < . . !  2 2  # ! $  F F ,   . a a D $ 	  	D(.dI8(( IV 
6(XJM
   M
^ 
6(XJ;
   ;
z 
5'L
 L
\ 
5'Y Yx 
5't
 t
n 
5'r
 r
j 
5'XJ|
    |
~ 
5'XJx
    x
v 
5'
 
rb   