
    }iC                        d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZ d dlmZ d dlZd dlZd dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+  eddg      Z,dede-de-de	e   fdZ.dede&fdZ/dedefdZ0de-deded e1de2f
d!Z3g i fd"ededed#e4d$e4d e1d%e4fd&Z5e,jm                  d'e	e&   (      dddd ee      fd)e
e7   d*e
e7   de
e-   de
e-   d"ef
d+       Z8e,js                  d,       ee       ee+      fd-e(d"ed.e:fd/       Z; G d0 d1e      Z<e,j{                  d2       ee       ee+      fd3e-d-e<d"ed.e:fd4       Z>e,js                  d5       ee       ee+      fd-e)d"ed.e:fd6       Z? G d7 d8e      Z@e,j                  d9       ee       ee+      fd-e@d"ed.e:fd:       ZBy);    )	APIRouterDependsHTTPException)Session)extract)ListOptional)dater
   time	timedelta)	BaseModelN)get_db)MassTemplate)MassSchedule)
Assignment)Asim)TemplatePosition)Unavailability)AsimAreaUnavailability)MassScheduleResponseAssignmentResponseGenerateRequestPublishRequest)require_pengurusz/api/schedules	Schedules)prefixtagstemplateyearmonthreturnc                     g }t        j                  ||      d   }t        d|dz         D ]>  }t        |||      }|j	                         | j
                  k(  s.|j                  |       @ |S )N   )calendar
monthrangeranger
   weekdayday_of_weekappend)r   r   r    datesnum_daysdayds          5/var/www/html/asim.com/backend/app/routes/schedule.pyget_dates_for_templater/      sg    E""4/2HQ1%uc"99;(...LLO & L    schedulec                    i i }| j                   r| j                   j                  D ]  }|j                  |j                  <   |j                  s)|j                  j
                  s@|j                  j                  |j                  j
                  j                  f||j                  <    g }| j                  D ]$  }|j                  |j                  d      \  }}|j                  t        |j                  |j                  |j                  |j                  r|j                  j                  nd |j                  r|j                  j                   nd |j                  r|j                  j"                  nd|j$                  |j&                  r|j&                  j(                  nd |j&                  r|j&                  j*                  nd |j,                  ||             ' |j/                  fd       t1        | j                  | j2                  | j4                  | j6                  | j8                  | j                   r| j                   j:                  nd | j                   r| j                   j<                  |      S d |      S )N)NNT)idposition_numberposition_type_codeposition_type_labelposition_type_colorposition_type_requires_asimasim_id	asim_nameasim_nois_overridearea_id	area_namec                 <    j                  | j                  d      S )Ni  )getr4   )xposition_orders    r.   <lambda>z)build_schedule_response.<locals>.<lambda>@   s    >#5#5a6G6G#Mr0   key)r3   template_idr
   notesis_publishedtemplate_nametemplate_timeassignments)r   	positions
sort_orderr4   posisiarear=   namarK   r@   r)   r   r3   r5   position_typelabelcolorrequires_asimr9   asim	full_nameno_asimr<   sortr   rF   r
   rG   rH   namer   )r1   position_areaprK   ar=   r>   rB   s          @r.   build_schedule_responser]   %   s   NM"",,A01N1,,-xxAHHMM45HH4D4DahhmmFXFX3Ya//0 -
 K!!*..q/@/@,O-tt-- 339: 5 5d9: 5 5dIJ(E(E^bII*+&&aff&&d&'ffAFFNN$
 	 "" MN;;((]]nn**080A0Ah'',,t080A0Ah'',,	 	 HL	 	r0   r-   c                 L    | j                         dz
  dz  }| t        |      z
  S )z1Hitung awal minggu (Sabtu) dari tanggal tertentu.      days)r'   r   )r-   days_since_saturdays     r.   get_week_startrd   M   s*     99;?a/y1222r0   r9   schedule_dateunavailabilitiesc                    |D ]l  }|j                   | k7  r|j                  dk(  r|j                  s0|j                  s=|j                  |cxk  r|j                  k  s]n `|j                   y|j
                  s{|j
                  j                  d      \  }}t        t        |      t        |            }|j                  |k(  s y|j                  dk(  s|j                  |j                  |j                         k7  r|j                   y|j
                  s |j
                  j                  d      \  }}t        t        |      t        |            }|j                  |k(  sm y y)N
date_rangeT:	recurringF)r9   unavail_type	date_fromdate_to	mass_timer   split	time_typeintr(   r'   )r9   re   r   rf   ut_ht_mrJ   s           r.   is_unavailableru   S   s   99>>\){{qyy;;-<199<{{*#}}#+==#6#6s#;S(1#c(CH(E;;-7#'^^{*}}(Q]]m>S>S>U-U{{"}}#==..s3S )#c(CH =;;-/- . r0   dbrecent_asim_datesassignment_countsarea_unavail_mapc                    | j                  t              j                  t        j                  dk(        j	                         i D ]  }t        |d      rpt        |j                  t              rV|j                  j                  d      D cg c]#  }|j                         s|j                         % c}|j                  <   t        |d      rHt        |j                  d      r2|j                  D cg c]  }|j                   c}|j                  <   g |j                  <    t        j                  d       }	t               |	D ]T  j                  j                   r"j"                  rj"                  j$                  nd }
j&                  rJj&                  j(                  s4| j+                  t-        j                  d j.                  d             t1        j2                        d|
ffd		} |d
      }|r|n |d
      }|s5| j+                  t-        j                  d j.                  d             
fd|j5                  fd       j7                  |d   j                  d      }|D cg c]$  }j7                  |j                  d      |k(  s#|& }}t9        fd|D              }|D cg c]  } |      |k(  s| }}t;        j<                  |      }| j+                  t-        j                  |j                  j.                  d             j+                  |j                         j7                  |j                  d      dz   |j                  <   j2                  |j                  <   W y c c}w c c}w c c}w c c}w )NTeligibilities,__iter__c                     | j                   S N)rM   )r[   s    r.   rC   zauto_assign.<locals>.<lambda>   s    r0   rD   F)schedule_idr9   r4   r5   r<   c                 $   g }D ]  }|j                   v rt        |j                   j                        r6
j                  r5
j                  j                  r	j                  |j                   g       vrw|r'|j                  |j                   t                     v rj                  |j                         }|r9t        |      k(  r| s(t        j                  |z
  j                        }|dk  r|j                  |       	 |S )Nr`   )r3   ru   r
   rQ   requires_eligibilityr@   setrd   absrb   r)   )relax_consecutive_area_idresultrU   	last_datediffall_asimry   assigned_this_scheduleeligible_mappospt_coderw   r1   schedule_week_startr   rf   s         r.   get_candidatesz#auto_assign.<locals>.get_candidates   s    F 7744!$''8==(DTU$$):):)O)Ol&6&6tww&CC ,<,@,@#%,P P-11$'':	 &i04GG ,"HMMI$=#C#CD19$d#- !. Mr0   )r   c           	          j                   j                  | j                  t        ddd            z
  j                  S )Ni  r#   )r
   r@   r3   rb   )r\   rw   r1   s    r.   	days_idlezauto_assign.<locals>.days_idle   s3    MM$5$9$9!$$T1a@P$QQWWWr0   c                 N    j                  | j                  d       |        fS )Nr   )r@   r3   )r\   rx   r   s    r.   rC   zauto_assign.<locals>.<lambda>   s#    '8'<'<QTT1'E	RS}&Ur0   r   c              3   .   K   | ]  } |        y wr    ).0r\   r   s     r.   	<genexpr>zauto_assign.<locals>.<genexpr>   s     <^y|^s   r#   )queryr   filter	is_activeallhasattr
isinstancer{   strro   stripr3   r5   sortedrL   r   	posisi_idrN   r=   rQ   rT   addr   r4   rd   r
   rX   r@   maxrandomchoice)rv   r1   r   rw   rx   rf   ry   rU   erL   pos_area_idr   strict_candidates
candidates	min_countr\   top_candidatesmax_idlechosenr   r   r   r   r   r   r   s    ``````            @@@@@@@r.   auto_assignr   m   s'    xx~$$T^^t%;<@@BH L4)j9K9KS.Q8<8J8J8P8PQT8U$c8U1YZY`Y`YbQWWY8U$cL!T?+8J8JJ0WCGCUCU$VCUaQ%9%9CU$VL!$&L!  x))/EFI U(( -0MMcjjcjj((d S%6%6%D%DFF:$KK # 3 3#*!  ,X]];-2[ 	 	6 +UC*;&bfAg
FF:$KK # 3 3#*!  	X 	UV%))*Q-*:*:A>	%/_Z3D3H3Hq3QU^3^!Z_<^<<%3P^y|x7O!^P~.
z II//&
 	 	""699-'8'<'<VYY'JQ'N&))$'/}}&))$a  %d$VP `Ps*   N61N6N;&$O O )O:Oz/weekly)response_modelrl   rm   c                    |j                  t              j                  t        j                  d k7        }| r]|r[|j                  t        j                  t        j                  |       k\  t        j                  t        j                  |      k        }nL|rJ|rH|j                  t        dt        j                        |k(  t        dt        j                        |k(        }|j                  t        j                        j                         }d }|j                  |       |D cg c]  }t        |       c}S c c}w )Nr    r   c                     | j                   r,| j                   j                  r| j                   j                  nd}| j                  |fS )N00:00)r   r   r
   )stime_strs     r.   sort_keyz&get_weekly_schedules.<locals>.sort_key   s0    &'jjQZZ__1::??'!!r0   rD   )r   r   r   rF   r
   	date_typefromisoformatr   order_byr   rX   r]   )	rl   rm   r    r   rv   q	schedulesr   r   s	            r.   get_weekly_schedulesr      s     	%%l&>&>$&FGAWHH!8!8!CC!8!8!AA
 
4HHG\../58FL--.$6

 

<,,-113I" NNxN 09:	1#A&	:::s   'D<z	/generatedata_c           
      t	   |j                  t              j                  t        dt        j                        | j
                  k(  t        dt        j                        | j                  k(  t        j                  dk(  t        j                  d k7        j                         }|D ]`  }|j                  t              j                  t        j                  |j                  k(        j                          |j                  |       b |j                          |j                  t              j                  t        j                   dk(  t        j"                  dk(        j                         }|j                  t$              j                  t$        j&                  dk(        j                         }|j                  t(              j                  t(        j"                  dk(  t(        j&                  dk(        j                         }i }|D ]?  }	|j+                  |	j,                  t/                     j1                  |	j2                         A i }
i }| j
                  dkD  r| j
                  dz
  nd}| j
                  dkD  r| j                  n| j                  dz
  }|j                  t              j5                  t              j                  t        dt        j                        |k(  t        dt        j                        |k(  t        j,                  d k7        j                         }|D ]Z  }|j,                  |
vs'|j6                  j                  |
|j,                     kD  s8|j6                  j                  |
|j,                  <   \ g }g }|D ]F  }t9        || j                  | j
                        }t;        |      D ]  }|j=                  ||f        H |j?                  d	 
       |D ]`  \  }}t        |j                  |d      }|j1                  |       |j                          tA        ||||
|||       |j=                  |       b 	 |jC                          |D ]  }|jK                  |        dtM        |       dtM        |      dS # tD        $ r |jG                          tI        dd      w xY w)Nr    r   FweeklyTapprovedr#      c                 2    | d   | d   j                   xs dfS )Nr   r#   r   )r   )rA   s    r.   rC   z$generate_schedules.<locals>.<lambda>1  s    qtQqTYY-A'&Br0   rD   )rF   r
   rH     z'Gagal menyimpan jadwal yang di-generatestatus_codedetailz
Generated  jadwal)messagecount)'r   r   r   r   r
   r    r   rH   rF   r   r   r   r3   deleteflushr   	mass_typer   r   statusr   
setdefaultr9   r   r   r=   joinr1   r/   r   r)   rX   r   commit	Exceptionrollbackr   refreshlen)r   rv   r   existingr   	templatesrf   area_unavailsry   aurw   rx   
prev_month	prev_yearprev_assignmentsr\   all_schedulesschedule_queuer   r*   r-   r1   s                         r.   generate_schedulesr      s    xx%,,**+tzz9))*dii7!!U*  D(	
 
ce  
##J$:$:add$BCJJL
		!  HHJ &--(*$& 
ce  xx/66+	ce 
 HH34;;((D0%%3 
ce  ##BJJ6::2::F  #'::>arJ!ZZ!^		QIxx
+00>EE**+z9))*i7d" 
ce	 
 99--::??.qyy99+,::??aii(  MN&xDJJGA!!1h-0  
 BC%8 

 	x

B(,=?PRbdtuX& &_
		 


1  $C$6#7w?#mJ\]]  _
4]^^_s   R 'R7c                   6    e Zd ZU dZee   ed<   dZee   ed<   y)OverrideRequestNr9   r5   )	__name__
__module____qualname__r9   r	   rq   __annotations__r5   r   r   r0   r.   r   r   H  s    !GXc]!(,,r0   r   z%/assignments/{assignment_id}/overrideassignment_idc                    |j                  t              j                  t        j                  | k(        j	                         }|st        dd      g }d|j                  v rP|j                  C|j                  }|j                  t              j                  t        j                  |j                  k(        j	                         }|rt        |j                        }|t        d      z   }	|j                  t              j                  t              j                  t        j                  |k(  t        j                  | k7  t        j                  |k\  t        j                  |	k        j                         }
|
D ]+  }|j                  |j                         d |_        d|_        - ||_        n!d|j                  v r|j                  d |_        d|j                  v r$|j"                  |j"                  |_        d |_        d|_        	 |j%                          d|dS # t&        $ r |j)                          t        d	d
      w xY w)Ni  zAssignment tidak ditemukanr   r9      ra   Tr5   r   zGagal menyimpan overridezOverride berhasil)r   cleared_assignment_ids)r   r   r   r3   firstr   model_fields_setr9   r   r   rd   r
   r   r   r   r)   r<   r5   r   r   r   )r   r   rv   r   r\   r   new_asim_idtarget_schedule
week_startweek_end	same_weekconflicts               r.   override_assignmentr   L  s   
##JMM]$BCIIKA4PQQD)))dll.Fll((<0771==8XY__a'(<(<=J!I1$55H,11,?FF""k1.!!Z/!!X-	
 ce  &&--hkk:#' '+$ &  		d++	+0D	t4449P9P9\#66	AMP
		 +F\]]  P
4NOOPs   H$ $'Iz/publishc                 H   | j                   D ]=  }|j                  t              j                  t        j                  |k(        j                         }|sJ|j                  t              j                  t        j                  |j                  k(  t        j                  |j                  k(  t        j                  dk(  t        j                  |k7        j                         }|r^|j                  t              j                  t        j                  |j                  k(        j                          |j                  |       d|_        @ 	 |j                          ddt!        | j                          diS # t        $ r |j                          t        dd      w xY w)NTr   zGagal publish jadwalr   r   z
Published r   )schedule_idsr   r   r   r3   r   rF   r
   rH   r   r   r   r   r   r   r   r   )r   rv   r   r   r1   existing_publisheds         r.   publish_schedulesr   w  sO   ((88L)00K1OPVVXXXl3::$$(<(<<.%%-OO{*	

 %' 	 HHZ ''
(>(>BTBWBW(WX__aII() $! )$L
		 C(9(9$:#;7CDD  L
4JKKLs   E: :'F!c                   "    e Zd ZU eed<   eed<   y)ResetDraftRequestr    r   N)r   r   r   rq   r   r   r0   r.   r   r     s    J
Ir0   r   z/draftc                    |j                  t              j                  t        dt        j                        | j
                  k(  t        dt        j                        | j                  k(  t        j                  dk(  t        j                  dk7        j                         }t        |      }|D ]`  }|j                  t              j                  t        j                  |j                  k(        j                          |j                  |       b 	 |j                          dd	| d
iS # t         $ r |j#                          t%        dd      w xY w)z;Hapus semua jadwal draft (unpublished) pada bulan tertentu.r    r   FNr   zGagal reset draftr   r   zReset z draft jadwal)r   r   r   r   r
   r    r   rH   rF   r   r   r   r   r3   r   r   r   r   r   )r   rv   r   draftsr   r   s         r.   reset_draftr     s    XXl#****+tzz9))*dii7!!U*  D(	
 
ce  KE
##J$:$:add$BCJJL
		! I
		 wm455  I
4GHHIs   D+ +'E)Cfastapir   r   r   sqlalchemy.ormr   
sqlalchemyr   typingr   r	   datetimer
   r   r   rp   r   pydanticr   r$   r   app.databaser   app.models.mass_templater   app.models.mass_scheduler   app.models.assignmentr   app.models.asimr   app.models.template_positionr   app.models.unavailabilityr   app.models.area_unavailabilityr   app.schemas.scheduler   r   r   r   app.core.securityr   routerrq   r/   r]   rd   listboolru   dictr   r@   r   r   postobjectr   r   putr   r   r   r   r   r   r0   r.   <module>r     s   5 5 "  ! J J     1 1 ,   9 4 A  /	*+	?\  S TRVZ &l &7K &P3d 3t 3C   `d im @  h5h5h5 h5 	h5
 h5 h5 h5X Id+?&@A#!&/;};c]; C=; 3-	;
 	; B;: [<CFOY`aqYr N^_ N^' N^PV N^ N^`-i - 34QXY_Q`nu  wG  oH (^s (^/ (^w (^ek (^ 5(^T Z:A&/W^_oWp EN E Ef E E6	  x7>vT[\lTm 6' 6W 66 6 6r0   