
    w(i                        S SK Jr  S SKJr  S SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJr  S SKJrJr  SS	KJr  S S
KJrJrJr  1 Skr1 Skr1 SkrSS1rSS1rS)S jrS r   S rS\S\S-  4S jr S\S\S\!4S jr"S)S\S\4S jjr#S\$S\RJ                  S \\\\4      S!\&S\'4
S" jr(S\$S\RJ                  S!\&S\'4S# jr)\RT                  S\$4S$ j5       r+S)S\$S%\S!\&S \\\\4      4S& jjr,S*S'\\   S!\&4S( jjr-g)+    )transaction)Q)timezone)datetimetime	timedelta)Function)Stamp)WorkingTimePolicyVacationPolicy   )WorkBalance)ListTupleOptional>   inclock_inlunch_inpre_entry_in>   out	clock_out	lunch_outpost_exit_out>   restrest_end
rest_startpre_entry_timebreak_startlunch_start	break_end	lunch_endNc                    U (       a  SSK Jn   UR                  R                  U S9nUR                  (       a  UR                  $ [        US5      (       a^  UR                  (       aM  [        R                  R                  UR                  S9R                  S5      R                  5       nU(       a  U$ [        R                  R                  S5      R                  5       $ ! UR                   a     N?f = f)a"  
Get working time policy for a user.
If user_id is provided, returns the user's assigned policy.
Falls back to the company's default policy (first policy for the user's company) if user has no policy assigned.
If no user_id, returns the first available policy (for backward compatibility).
r   )Userid
company_id)r&   
created_at)user.modelsr#   objectsgetworking_time_policyhasattrr&   r   filterorder_byfirstDoesNotExist)user_idr#   usercompany_policys       (D:\TimeStamps\worktimeservice\service.pyget_active_working_policyr5      s     $	<<##w#/D''/// t\**t!2!:!:!A!AT__!A!]!f!fgs!t!z!z!|!))
 $$--l;AACC	    		s   5C! A.C! !C43C4c                  \    [         R                  R                  S5      R                  5       $ )Nz-created_at)r   r)   r.   r/        r4   get_active_vacation_policyr9   0   s"    !!**=9??AAr8   c                 .    [         R                  " X5      $ N)r   combine)dts     r4   $_combine_datetime_from_date_and_timer?   E   s    A!!r8   dtreturnc                     U c  gU R                   c*  [        R                  " U [        R                  " 5       5      $ U R	                  [        R                  " 5       5      $ )z
Ensure datetime is timezone-aware. If dt.tzinfo is None, make it aware using
Django's current timezone (usually settings.TIME_ZONE). If dt already aware,
normalize to the same timezone object (preserve tz).
N)tzinfor   
make_awareget_current_timezone
astimezone)r@   s    r4   ensure_awarerG   I   sJ     
z	yy""2x'D'D'FGG==66899r8   abc                 |    [        U 5      n[        U5      nX2-
  R                  5       n[        S[        U5      5      $ )z
Return positive seconds between two datetimes.
Both datetimes will be made timezone-aware (current timezone) before subtraction.
Returns 0 if b <= a.
r   )rG   total_secondsmaxint)rH   rI   a_awareb_awarediffs        r4   seconds_betweenrQ   W   s8     1oG1oG,,.Dq#d)r8   sc                    U(       a  [        USS5      n[        USS5      nU(       a  U(       a}  U R                  (       al  [        U R                  S5      (       a  U R                  R                  5       OU R                  n[        R
                  " X@R                  5      n[        U5      $ [        R
                  " U R                  U R                  5      n[        U5      $ )a  
Return the effective timestamp for a stamp (combine date + time),
using current timezone and ensuring timezone-awareness.

Special handling for with_reason stamps:
- If out=true and with_reason=true: Use return_date.date() + time column
- Otherwise: Use normal date + time
r   Fwith_reasondate)getattrreturn_dater,   rU   r   r<   r   rG   )rR   func_objis_outrT   return_date_onlytss         r4   _stamp_timestampr\   c   s     5%0hu=6amm7>q}}f7U7Uq}}113[\[h[h!!"2FF;B## 
		!&&!&&	)Br8   r1   for_datework_intervalsfunction_mapc                 b   U[        SS9-
  n[        R                  R                  XS9R	                  SS5      nSn[        [        U5      5       GH5  nUR                  UR                  5      nU(       a  [        USS5      OSn	U	(       a  U(       a  [        [        US	S5      5      (       a}  UR                  (       al  [        UR                  S
5      (       a  UR                  R                  5       OUR                  n
[        [        R                   " XR"                  5      5      n  O_UR                  (       a  [        UR                  5      n  O7U(       d  GM  [        [        US	S5      5      (       d  GM+  [%        Xx5      n  O   U(       a  U(       a  US   S   n['        Xk5      nUS:  $ g)zb
Check if gap between previous day's last work end and today's first start is less than 11 hours.
r   daysr1   rU   
start_dater'   NrT   Fr   rU   r   i  )r   Stampsr)   r-   r.   reversedlistr*   stamp_functionrV   boolrW   r,   rU   rG   r   r<   r   r\   rQ   )r1   r]   r^   r_   	prev_dateprev_stampsprev_last_endrR   rX   rT   rZ   first_startgap_secss                r4   check_daily_rest_violationro      sS    9!,,I..'''HQQR^`lmK(,M d;'(##A$4$45AIghu=u 8WXue-L(M(MRSR_R_7>q}}f7U7Uq}}113[\[h[h()9)9:JFF)STM]](7MX$wx>??,Q9M# )& $Q'*"=>9%%r8   c                    U[        UR                  5       S9-
  nU[        SS9-   n[        R                  R	                  U S9R	                  [        X44S9[        X44S9-  [        [        R                  " [        R                  " U[        R                  5      5      [        R                  " [        R                  " U[        R                  5      5      S9-  5      R                  SS5      n/ nU H  nUR                  UR                  5      nU(       a  [!        US	S
5      OS
n	U	(       a  UR#                  [%        Xx5      X45        MY  UR&                  (       a`  UR(                  (       aO  UR#                  [+        UR&                  5      X45        UR#                  [+        UR(                  5      SU45        M  UR#                  [%        Xx5      X45        M     UR-                  S S9  / n
SnSnS
nU H  u  pnUS:X  a  M  U(       a7  [/        [!        USS
5      5      n[!        US	S
5      n	U(       + =(       a    US;  nO/SUR                  =(       d    SR1                  5       ;   nU(       + nS
n	U(       a4  Uc  UnU	(       a&  U(       a  Ub  U
R#                  X45        SnS
nM  M  M  M  U(       d  M  Ub  U
R#                  X45        SnU	(       d  M  UnSnM     U
(       a  [+        [        R                  " U[        R                  5      5      nSnU
 H  u  nn[3        UU5      nUU:  a  UnUnM     [3        U[+        [        R                  " U[        R                  5      5      5      nUU:  a  UnUS:  $ [3        [+        [        R                  " U[        R                  5      5      [+        [        R                  " U[        R                  5      5      5      nUS:  $ )zx
Compute longest continuous rest in the calendar week (Mon-Sun).
Violation if longest_rest < 35 hours (126000 seconds).
ra      r1   )date__range)start_date__date__rangestart_date__ltereturn_date__gterd   r'   rT   Freturn_markerc                     U S   $ Nr   r7   xs    r4   <lambda>-check_weekly_rest_violation.<locals>.<lambda>   s    !r8   keyNr   )Nrx    Tr   i0 )r   weekdayre   r)   r-   r   r   rD   r   r<   dtimerL   minr.   r*   rh   rV   appendr\   rd   rW   rG   sortri   lowerrQ   )r1   r]   r_   
week_startweek_endweek_qsw_eventsrR   rX   rT   week_intervalsw_inwith_reason_out_timestampwaiting_for_with_reason_inr[   rY   is_inprev_endlongest_restrH   rI   gap	final_gaps                          r4   check_weekly_rest_violationr      s|   
 I8+;+;+=>>JI1--H nn## $ f	z,-	:"89	:	(--h.>.>x.ST#..x/?/?
EII/VW	Y	Y
 h|\*  79H##A$4$45 BJghu=uOO-a:HHI\\ammOO\!,,7EFOO\!--8/1MN OO-a:HHI " MMnM%68N#D $!&#a&'(E59:F!(M5AKJJ83J#JEq//52<<>>FJEK | 9>W>c %%'@&EF,0)-2* ?d9{ V%%tj1 {,.)-1*Q $V  0 0UYY GH"DAq!(A.C\!"H	 # $Hl8;K;KHV[V_V_;`.ab	|#$L 9%% '|H4D4DZQVQZQZ4['\'3H4D4DXuyy4Y'Z\ 9%%r8   c                 r  ^D [        U 5      n[        5       n[        R                  " 5       n[	        [
        R                  " U[        R                  5      5      n[	        [
        R                  " U[        R                  5      5      n[        R                  R                  U S9R                  [        US9[        XeS9-  [        US9-  5      R                  SS5      nUR                  5       (       dY  [         R                  R                  XS9R#                  5         SS	KJn  UR                  R                  XS9R#                  5         g
[(        R                  R+                  5        V	s0 s H  oR,                  U	_M     sn	mD/ n
U H  nTDR/                  UR0                  5      nU(       a  [3        USS5      OSnU(       a  U
R5                  [7        X5      X45        MY  UR8                  (       a`  UR:                  (       aO  U
R5                  [	        UR8                  5      X45        U
R5                  [	        UR:                  5      SU45        M  U
R5                  [7        X5      X45        M     U
R=                  S S9  SnSnS
nS
n/ nS
nS
nS
nSnU
 GH  u  npUS:X  a  M  U(       a<  [3        USS5      n[3        USS5      n[3        USS5      n[3        USS5      nU(       + nO3UR0                  =(       d    SR?                  5       nSU;   nSU;   nSnSnSnU(       aA  Uc  UnU(       a4  U(       a-  Ub*  [A        UU5      nUU-  nUR5                  UU45        UnS
nSnO=U(       a6  Ub(  [A        UU5      nUU-  nUR5                  UU45        UnS
nU(       a  UnSnU(       a(  U(       a  Uc  UnOU(       a  Ub  U[A        UU5      -  nS
nU(       d  GMC  UR:                  (       d  GMW  SnURB                  (       a   SSK"J#n  SS
K$nUR                  R                  URB                  S9RK                  5       n U (       dL   URM                  [O        URB                  5      5      n!UR                  R                  U!S9RK                  5       n U (       a$  U RT                  (       a  U RV                  (       a  SnU(       aa  [A        UR8                  UR:                  5      n"UU"-  nUR5                  [	        UR8                  5      [	        UR:                  5      45        GM  U[A        UR8                  UR:                  5      -  nGM     Sn#U(       Ga  UR[                  5       n$U$S::  a  [3        USS
5      (       ar  [3        USS
5      (       a`  UR\                  n%UR^                  n&[a        [
        R                  " UU&5      [
        R                  " UU%5      -
  Rc                  5       5      n#GOU$S:X  a  [3        USS
5      (       aq  [3        USS
5      (       a_  URd                  n%URf                  n&[a        [
        R                  " UU&5      [
        R                  " UU%5      -
  Rc                  5       5      n#OU$S :X  a  [3        US!S
5      (       aq  [3        US"S
5      (       a_  URh                  n%URj                  n&[a        [
        R                  " UU&5      [
        R                  " UU%5      -
  Rc                  5       5      n#O[3        US#S5      n#[m        S$U#5        U(       a  [3        US%S
5      b  URn                  S&-  OS'n'U(       a  [3        US(S
5      b  URp                  S)-  OS*n(U(       a  U=(       a    [s        [3        US+S5      5      OSn)U(       a  [3        US,S
5      b  URt                  S)-  OS-n*U(       a  [3        US.S
5      b  URv                  S&-  OS/n+U(       a  [3        US0S
5      b  URx                  S)-  OS1n,Sn-[{        UD4S2 jU 5       5      n.UU':  aE  UU(:  a?  Sn-U(       a6  [s        [3        US3S5      5      (       d  U.(       d  U(U-
  n/[        SUU/-
  5      nU)(       a  UU+:  a  UU,:  a   Un0[a        [        SU0U#-
  5      5      n1[a        U0U#-
  5      n2U(       aM  [s        [3        US4S5      5      (       a2  [a        [3        US5S65      S&-  5      n3[a        [3        US7S85      S&-  5      n4Sn5Sn6U(       aZ  [s        [3        US9S5      5      (       a?  [a        [3        US:S5      S&-  5      n7[3        US;S<5      n8[3        US=S85      n9[        U1U75      n5Sn:U(       a:  [s        [3        US>S5      5      (       d  [3        [3        US?S
5      S@S
5      (       a  U1n:[}        XUTD5      n;[        XTD5      n<SAn=U(       aY  [3        USBS
5      SC:X  a  [        SDS5      n=O;[3        USBS
5      SE:X  a*  [3        USFS
5      (       a  [        UR                  5      SG-  n=Sn>U GH+  nTDR/                  UR0                  5      nU(       a  [s        [3        USS5      5      OSnU(       Ga  UR8                  (       Ga  UR:                  (       Ga  [m        SHU5        [        UR8                  SI5      (       a  UR8                  R                  5       OUR8                  n?[        UR:                  SI5      (       a  UR:                  R                  5       OUR:                  n@U?Us=::  a  W@::  a  O  GM
  URB                  (       a   SSK"J#n  SS
K$nUR                  R                  URB                  S9RK                  5       n U (       dL   URM                  [O        URB                  5      5      n!UR                  R                  U!S9RK                  5       n U (       a,  U RT                  (       a  U RV                  (       a  Sn>  OYGM  GM  GM  [m        SK5        GM  GM  [m        SLU SM[s        UR8                  5       SN[s        UR:                  5       35        GM.     U>(       aW  [m        SO5        [         R                  R                  U U[a        U#5      [a        U#5      S[a        U#5      SSSSSU=SSSSP.SQ9u  nBnCO[m        SR5        [         R                  R                  U U[        UU#5      [a        U5      [a        U5      [a        U05      [a        U15      [a        U25      [a        U55      [a        U65      [a        U:5      U=U-U;U<SP.SQ9u  nBnC[        U WBXTDUU5        UB$ s  sn	f ! [P        [R        4 a     GNf = f! [X         a     GNf = f! [P        [R        4 a  nA S
nAAAGNS
nAAAff = f! [X         a  nA[m        SJUA 35         S
nAAAGM  S
nAAAff = f)SaW  
Compute WorkBalance for a user & date.

Rules / assumptions:
  - Normal stamps -> timestamp = combine(date, time)
  - Pre-time entries (start_date & return_date) -> used for multi-hour breaks / pre-entries
  - Function model fields expected: function_ref_id, out (bool), pre_function (bool), break_flag (bool)
  - Policy provides monday_friday_start, monday_friday_end, saturday_start/end, sunday_start/end,
    lunch_break_required_after (hours), lunch_break_duration (minutes), lunch_break_paid (bool),
    use_time_banking (bool), max_bank_balance (hours), workers_self_register_overtime (bool)
rr   )rU   ru   )start_date__daterd   r'   rc   r   BalanceDetailNrT   Frx   c                     U S   $ rz   r7   r{   s    r4   r}   <calculate_daily_balances_for_user_and_date.<locals>.<lambda>T      adr8   r   r   
break_flagpre_functionr   r   TPaycodepaycoder$   p     monday_friday_startmonday_friday_end   saturday_startsaturday_endrq   sunday_start
sunday_enddefault_daily_secondshimlunch_break_required_afteri  i`T  lunch_break_duration<   i  short_break_requiredshort_break_duration_minutesi   short_break_required_after_hoursi@8   minimum_total_break_time_minutesi
  c              3      >#    U  HX  n[        TR                  UR                  5      S S5      =(       d&    SUR                  =(       d    SR                  5       ;   v   MZ     g7f)r   Flunchr   N)rV   r*   rh   r   ).0rR   r_   s     r4   	<genexpr>=calculate_daily_balances_for_user_and_date.<locals>.<genexpr>  sZ       A 	  !1!12L%H 	4A$$*1133	4s   A A#lunch_break_paiduse_flextimemax_flex_negativeimax_flex_positive(   use_time_bankingmax_bank_balanceovertime_conversion_daily   overtime_conversion_weeklyworkers_self_register_overtime
track_toil__bool__g        vacation_accrual_typestandard_finnishg?customcustom_accrual_rateg      >@zyes its a pre stamprU   z#DEBUG: Exception checking paycode: z!DEBUG: Stamp has no paycode fieldzCDEBUG: Stamp does not meet pre-function criteria - is_pre_function=z, has_start=z, has_return=zis absence date)regular_work_secondstotal_work_secondsdaily_break_secondsnet_work_secondsovertime_secondsflex_secondsbank_credited_secondsbank_debited_secondstoil_secondsvacation_days_accruedlunch_break_missing_flagdaily_rest_violation_flagweekly_rest_violation_flag)r1   rU   defaultsznot is absence date)Gr5   r9   r   rE   rG   r   r<   r   r   rL   re   r)   r-   r   r.   existsr   deletebalancedetail.modelsr   r	   allfunction_ref_idr*   rh   rV   r   r\   rd   rW   r   r   rQ   r   paycode.modelsr   uuidr/   UUIDstr
ValueErrorAttributeError	isAbsenceisPaid	Exceptionr   r   r   rM   rK   r   r   r   r   printr   r   ri   r   r   r   anyro   r   roundfloatr   r,   rU   update_or_create$calculate_balance_details_by_paycode)Er1   r]   policyvacation_policytz	day_startday_end	stamps_qsr   feventsrR   rX   rT   r   total_break_secondsin_stackr   r^   last_out_timer   r   r[   rY   is_breakis_pre_functionr   
func_lowerinterval_secsis_paid_absencer   r   paycode_objpaycode_uuidwork_secondsscheduled_work_secondsr   startendlunch_required_after_secondslunch_break_duration_secondsr   short_break_duration_seconds"short_break_required_after_secondsminimum_total_break_secondslunch_missinghas_lunch_stampsmissingr   r   r   max_flex_negative_secsmax_flex_positive_secsr   r   max_bank_secsr   r   r   daily_rest_violationweekly_rest_violationr   is_paid_absence_datestamp_start_datestamp_return_dateewbcreatedr_   sE                                                                       @r4   *calculate_daily_balances_for_user_and_dater    sk    'w/F02O 
	&	&	(BX--h		BCI8++Heii@AG %%g%6==	x	'>	?	8$	% h|\*	  ""7"BIIK 	7$$W$DKKM 3;2B2B2F2F2HI2HQ%%q(2HIL 57F##A$4$45 BJghu=u MM+A8(FG\\amm MM<5xCDMM<6KL MM+A8(FG% ( KKNK# #'H&*K68N HM !%!&!H& Xue4Fxu=H%hFO!(M5AKJE**0b779JJ&Ej(FH#OK  9>W>c !00I2 N"m3"%%'@"&EF ",0)-2* # /" ="m3"%%xn5 " ,.)-1*
 &"$K*'?;+KK'"&K ?q}}}#Oyy6")//"8"8"8"K"Q"Q"SK&!+/99S^+DL*1//*@*@L*@*Q*W*W*YK #{'<'<ASAS*. .q||Q]]K"l2"%%|ALL'A<PQP]P]C^&_` $q||Q]]'SS#C "P &""$a<GF,A4HHWU[]prvMwMw..E**C%((*:*:8S*IHL\L\]eglLm*m)|)|)~%"\gf.>EE'RXZhjnJoJo))E%%C%((*:*:8S*IHL\L\]eglLm*m)|)|)~%"\gfndCCPVXdfjHkHk''E##C%((*:*:8S*IHL\L\]eglLm*m)|)|)~%" &-V5Lh%W"	%'( RX\cdj  mI  KO  ]P  ]\F$E$E$L  ck IOT[\bdz  }A  UB  UNF$?$?"$D  U\  ^d6Yd76;QSW+X&YimQW\cdj  mK  MQ  ]R  ]^F$G$G"$L  el ]chopv  y[  ]a  ib  in&*Q*QTX*X  u}&TZ_fgm  pR  TX  `Y  `e6#J#JR#O  lsM    99>QTp>p
 $wv/A4HIIRb25HHG!$Q(:W(D!E  26X X!<<
 *3q"25K"KLM '*@@AL$wv~u=>>!$WV5H#%NQU%U!V!$WV5H"%MPT%T!U $wv'95ABBGF,>BTIJ$+F4OQR$S!%,V5QSU%V" #$4m DLd76+KUSTT7?L$?TRR+L
 6gYef7<X
  ?$;TBFXX$)*a$8!_&=tDPU\]l  oD  FJ  VK  VK$)/*M*M$NQU$U! !##A$4$45LT$wxGHZ_ q|||'86=allF6S6Sq||002YZYeYe8?v8V8V 2 2 4\]\i\i
  8@/@@@99:#&-oo&<&<QYY&<&O&U&U&W  +%/3yyQYY/H.5oo.D.D.D.U.[.[.]
 '*449K9K7; 4 % :L4
 ! =?? AB WXgWhhtuyz{  {G  {G  vH  uI  IV  W[  \]  \i  \i  Wj  Vk  l  ma j   "))::(+,B(C&)*@&A'($'(>$?$% !)*() !)>,1-2.3 ; 
G( 	#$!))::(+,>@V(W&)*<&='*+>'?$'(8$9$'(8$9 #L 1),-B)C(+,@(A #L 1)>,9-A.C ; 
G. )"h<YgiopIS J~ !+N; ! ! ! x %/#? % $% %  CA3GHs|   -uAu#Au+u#6Av9Au4+vu u#u  u##
u10u14vv
vv
v6v11v6work_balancec                 L   SSK Jn  UR                  R                  XS9R	                  5         [
        R                  R                  S5      R                  5        Vs0 s H"  oR                  (       d  M  UR                  U_M$     n	n0 n
U Hp  nUR                  U	;   d  M  XR                     nUR                  nUR                  U
;  a  U/ S.XR                  '   XR                     S   R                  U5        Mr     U
R                  5        GHb  u  pUS   nUS   nSnU GH  nUR                  UR                  5      nU(       a  [!        [#        USS5      5      OSnU(       d  MG  UR$                  (       d  MZ  UR&                  (       d  Mm  [)        UR$                  S	5      (       a  UR$                  R+                  5       OUR$                  n[)        UR&                  S	5      (       a  UR&                  R+                  5       OUR&                  nUUs=::  a  U::  d  M  O  GM  UR                  (       d  GM   SS
KJn  SSKnUR                  R                  UR                  S9R3                  5       nU(       dL   UR5                  [7        UR                  5      5      nUR                  R                  US9R3                  5       nU(       a,  UR<                  (       a  UR>                  (       a  Sn  OGM  GM  GM     [C        UX$X5      nU(       Ga  [E        U 5      nSnU(       Ga  URG                  5       nUS::  a  [#        USS5      (       ar  [#        USS5      (       a`  URH                  nURJ                  n[M        [N        RP                  " UU5      [N        RP                  " UU5      -
  RS                  5       5      nGOUS:X  a  [#        USS5      (       aq  [#        USS5      (       a_  URT                  nURV                  n[M        [N        RP                  " UU5      [N        RP                  " UU5      -
  RS                  5       5      nOUS:X  a  [#        USS5      (       aq  [#        USS5      (       a_  URX                  nURZ                  n[M        [N        RP                  " UU5      [N        RP                  " UU5      -
  RS                  5       5      nO[#        USS5      n[M        U5      [M        U5      S[M        U5      SSSSSSSS.nUR                  R]                  U UUS	U0UES9u  n n!U!(       a  GM+  UR                  5        H  u  n"n#[_        U U"U#5        M     U Ra                  5         GMe     gs  snf ! [8        [:        4 a     GNf = f! [@         a     GM~  f = f)z
Calculate detailed balance breakdown by paycode using the same logic as WorkBalance
but grouped by paycode - this ensures natural tally without forced distribution
r   r   rc   r   )r   stampsr  Fr   rU   r   Nr   r$   Tr   r   r   r   r   r   r   rq   r   r   r   r   r   r   r   r   r   r   r   overtime_balance_secondsr   r   )r1   r  r   r   )1r   r   r)   r-   r   r	   select_relatedr   
paycode_idr   rh   r   r%   r   itemsr*   ri   rV   rd   rW   r,   rU   r   r   r   r/   r   r   r   r   r   r   r   calculate_hours_for_paycoder5   r   r   r   rM   r   r<   rK   r   r   r   r   get_or_createsetattrsave)$r1   r  r]   r   r_   r^   r   r   funcfunctions_with_paycodepaycode_stampsstampfunctionr   r  paycode_datapaycode_stamp_listis_paid_absence_paycoderR   rX   r   r  r  r   r   r   r   paycode_hoursr   r   r  r  balance_detailr  fieldvalues$                                       r4   r   r     s2    3    @GGI FNEUEUEdEdenEoEsEsEu  JEuT  zI  zI8d22D8Eu  J N#99-.B.BCH&&Gzz/& .zz*
 ::&x077>  %3$8$8$: 
y))(3 #(#A#''(8(89HPXd78^U#KL^cO1<<<AMMM:A!,,PV:W:W1<<#4#4#6]^]i]i <CAMMSY<Z<ZAMM$6$6$8`a`m`m! $xD3DDDyyy!>'*1//*@*@*@*S*Y*Y*[K#.!)3799S^3LL29//2H2HL2H2Y2_2_2aK  +{/D/DI[I[:> 7 % J\/D{3 $@ 44F`gp #.w7F%-""**,a<GF4I4$P$PU\]cexz~UU"66E 22C-0(2B2B8S2QT\TdTdemotTu2u  2E  2E  2G  .H*\gf6F&M&MRYZ`bprvRwRw"11E --C-0(2B2B8S2QT\TdTdemotTu2u  2E  2E  2G  .H*\gfnd&K&KPWX^`lnrPsPs"//E ++C-0(2B2B8S2QT\TdTdemotTu2u  2E  2E  2G  .H*-4V=TV^-_* ),,B(C&)*@&A'($'(>$?$% !)*(),- !)*M #0"7"7"E"E%	 #F #
 w - 3 3 5uu5 !6!y %;' J` )3N'C !)$(!)
  ) ! !sD   U85U8<AV?AU=
+V=VVVV
V#"V#r  c                    [         R                  " 5       n[        [        R                  " U[
        R                  5      5      n[        [        R                  " U[
        R                  5      5      n/ nU  H  n	UR                  U	R                  5      n
U
(       a  [        U
SS5      OSnU(       a  UR                  [        X5      X45        MY  U	R                  (       a`  U	R                  (       aO  UR                  [        U	R                  5      X45        UR                  [        U	R                  5      SU	45        M  UR                  [        X5      X45        M     UR                  S S9  SnSnSnSn/ nSnSnSnSnU GH  u  npU
S:X  a  M  U
(       a<  [        U
SS5      n[        U
S	S5      n[        U
S
S5      n[        U
SS5      nU(       + nO3U	R                  =(       d    SR!                  5       nSU;   nSU;   nSnSnSnU(       aA  Uc  UnU(       a4  U(       a-  Ub*  [#        UU5      nUU-  nUR                  UU45        UnSnSnO=U(       a6  Ub(  [#        UU5      nUU-  nUR                  UU45        UnSnU(       a  UnSnU(       a(  U(       a  Uc  UnOU(       a  Ub  U[#        UU5      -  nSnU(       d  GMC  U	R                  (       d  GMW  SnU	R$                  (       a   SSKJn  SSKnUR,                  R/                  U	R$                  S9R1                  5       nU(       dL   UR3                  [5        U	R$                  5      5      nUR,                  R/                  US9R1                  5       nU(       a$  UR:                  (       a  UR<                  (       a  SnU(       aa  [#        U	R                  U	R                  5      n UU -  nUR                  [        U	R                  5      [        U	R                  5      45        GM  U[#        U	R                  U	R                  5      -  nGM     U(       d  [A        U5      nSn!U(       Ga  URC                  5       n"U"S::  a  [        USS5      (       ar  [        USS5      (       a`  URD                  n#URF                  n$[I        [        R                  " UU$5      [        R                  " UU#5      -
  RK                  5       5      n!GOU"S:X  a  [        USS5      (       aq  [        USS5      (       a_  URL                  n#URN                  n$[I        [        R                  " UU$5      [        R                  " UU#5      -
  RK                  5       5      n!OU"S:X  a  [        USS5      (       aq  [        USS5      (       a_  URP                  n#URR                  n$[I        [        R                  " UU$5      [        R                  " UU#5      -
  RK                  5       5      n!O[        USS5      n!Un%[I        [        SU%U!-
  5      5      n&[I        U%U!-
  5      n'[        UU!5      n(U(UUU%U&U'SSSSSS.$ ! [6        [8        4 a     GNf = f! [>         a     GNf = f)zX
Calculate hours for a specific paycode using the same logic as WorkBalance calculation
rT   Frx   c                     U S   $ rz   r7   r{   s    r4   r}   -calculate_hours_for_paycode.<locals>.<lambda>B  r   r8   r   r   Nr   r   r   r   r   Tr   r   r$   r   r   r   r   r   r   r   rq   r   r   r   r  )*r   rE   rG   r   r<   r   r   rL   r*   rh   rV   r   r\   rd   rW   r   r   rQ   r   r   r   r   r)   r-   r/   r   r   r   r   r   r   r   r5   r   r   r   rM   rK   r   r   r   r   ))r  r]   r_   r1   r   r   r   r   r   rR   rX   rT   r   r   r   r   r^   r   r   r   r[   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   s)                                            r4   r  r  #  s    
	&	&	(BX--h		BCI8++Heii@AG 57F##A$4$45 BJghu=uMM+A8(FG\\amm MM<5xCDMM<6KL MM+A8(FG! $ KKNK# #'H&*K68N HM !%!&!H& Xue4Fxu=H%hFO!(M5AKJE**0b779JJ&Ej(FH#OK  9>W>c !00I2 N"m3"%%'@"&EF ",0)-2* # /" ="m3"%%xn5 " ,.)-1*
 &"$K*'?;+KK'"&K ?q}}}#Oyy6")//"8"8"8"K"Q"Q"SK&!+/99S^+DL*1//*@*@L*@*Q*W*W*YK #{'<'<ASAS*. .q||Q]]K"l2"%%|ALL'A<PQP]P]C^&_` $q||Q]]'SS# "D *73%""$a<GF,A4HHWU[]prvMwMw..E**C%((*:*:8S*IHL\L\]eglLm*m)|)|)~%"\gf.>EE'RXZhjnJoJo))E%%C%((*:*:8S*IHL\L\]eglLm*m)|)|)~%"\gfndCCPVXdfjHkHk''E##C%((*:*:8S*IHL\L\]eglLm*m)|)|)~%"%,V5Lh%W" *3q"25K"KLM'*@@AL 13IJ !502,,$!" !$%!" [ !+N; ! ! ! s8   /AY&2AY=+Y&Y#Y&"Y##Y&&
Y43Y4r;   )NN).	django.dbr   django.db.modelsr   django.utilsr   r   r   r   r   functions.modelsr	   stamps.modelsr
   re   company.modelsr   r   modelsr   typingr   r   r   IN_FUNCTIONSOUT_FUNCTIONSREST_FUNCTIONSBREAK_STARTS
BREAK_ENDSr5   r9   r?   rG   rM   rQ   r\   r   rU   dictri   ro   r   atomicr  r   r  r7   r8   r4   <module>rA     s   "  ! 7 7 % ) ;  ( ( >BE}-;'
D2B	31%
":X :(T/ :	x 	H 	 	 ( 8   x}}  VZ[`aiksas[tVu    FJ    OS  Fh& h& h&UY h&^b h&\ Q Q Qh{"# {"[ {"uy {"  LP  QV  W_  ai  Wi  Qj  Lk {"|zV zd zr8   