
    Jis:                     p   d Z ddlmZmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZ d	ed
edee   fdZd	ed
edededee   f
dZd	ed
edee   dedee   f
dZd	eded
edefdZd	ed
edededee   f
dZ d	edededz  fdZ!d	ed
edededee   f
dZ"	 d6d	ed
ededede#dede#dz  defdZ$d	ed
eded ededz  f
d!Z%d	ed
edededee   f
d"Z&d	ed#ededz  fd$Z'd	ed
edededz  fd%Z(	 d7d	ed
edededee#   d&ee#   d'edefd(Z)d	ed
ed#ededz  fd)Z*d	ededdfd*Z+d	ed#eddfd+Z,d	ed
ed#ed ededz  f
d,Z-d	ed
edededee   f
d-Z.d	ed.ededz  fd/Z/d	ed
edededz  fd0Z0	 d7d	ed
ededed1e#dz  d2ee   d'edefd3Z1d	ed
ed.ededz  fd4Z2d	ed.eddfd5Z3y)8uE   General Affairs repository — operators, jadwal, absensi DB queries.    )datedatetimetimezone)deleteselect)AsyncSession)selectinload)AbsensiHousekeepingHousekeepingFotoHousekeepingItemJadwalShiftSapras
SaprasItem)RoleUserSpbuAssignment)Userdbspbu_idreturnc           
        K   | j                  t        t        t        t              j                  t        t        j                  t        j                  k(        j                  t        t        j                  t        j                  k(        j                  t        j                  |k(  t        j                  j                  d      t        j                  j                  d                   d{   }|j                         }|D cg c]5  \  }}}|j                  |j                  |j                   |j"                  d7 c}}}S 7 Yc c}}}w w)zFReturn users assigned to spbu_id whose role has can_be_scheduled=True.TN)idnamaposisi	is_active)executer   r   r   r   joinuser_idr   role_idwherer   can_be_scheduledis_
deleted_atallnamer   r   )r   r   resultrows_userroles          M/var/www/html/spbu.com/backend/app/repositories/general_affairs_repository.pyget_operatorsr,      s     ::!4.	d&..$''9	:	d&..$''9	:	&&'1!!%%d+OO%

		 	F ::<D " "MAtT ''IIii		
 " 	s$   C.E0E
1E:EEEstartendc                   K   | j                  t        t              j                  t	        t        j
                        t	        t        j                              j                  t        j                  |k(  t        j                  |k\  t        j                  |k        j                  t        j                  t        j                               d {   }t        |j                         j                               S 7 +wN)r   r   r   optionsr	   r)   shiftr    r   tanggalorder_byr   listscalarsr$   r   r   r-   r.   r&   s        r+   
get_jadwalr8   *   s      ::{	k../k>O>O1P	Q	7*5(3&


 
+%%{':':	;	 	F  $$&''	s   CD C>,D itemscreated_by_idc                   K   g }|D ]  }| j                  t        t              j                  t        j                  |k(  t        j
                  |d   k(  t        j                  |d   k(  t        j                  |d   k(               d{   }|j                         rt        ||d   |d   |d   |      }| j                  |       |j                  |        | j                          d{    |S 7 l7 w)z4Insert multiple jadwal rows, skip if already exists.r   shift_idr3   N)r   r   r<   r3   r:   )r   r   r   r    r   r   r<   r3   scalar_one_or_noneaddappendflush)r   r   r9   r:   createditemexistingjs           r+   create_jadwal_bulkrE   :   s      G;%%##w.##tI6$$Z(88##tI6	
 
 &&(O*%O'
 	q	q' ( ((*N)
& s%   BC;
C7A%C;0C91C;9C;	jadwal_idc                 P  K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(               d {   }|j                         }|sy| j                  |       d {    | j                          d {    y7 I7 7 	w)NFT)	r   r   r   r    r   r   r=   r   r@   )r   rF   r   r&   rD   s        r+   delete_jadwalrH   Z   s     ::{!!NNi'7*	
 F 	!!#A
))A,
((* s6   AB&B +B&B"B&B$B&"B&$B&c           	      P  K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                              j                  t        j                  |k(  t        j                  |k\  t        j                  |k        j                  t        j                  j                         t        j                               d {   }t        |j                         j!                               S 7 +wr0   )r   r   r
   r1   r	   r2   uploaded_byreviewed_byr    r   r3   r4   descr<   r5   r6   r$   r7   s        r+   get_absensirM   k   s      ::w	',,-,,-


 
OOw&OOu$OOs"


 
'//&&('*:*:	; F  $$&''s   C6D&8D$9,D&
absensi_idNc           	      f  K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                              j                  t        j                  |k(               d {   }|j                         S 7 wr0   )r   r   r
   r1   r	   r2   rJ   rK   r    r   r=   )r   rN   r&   s      r+   get_absensi_by_idrP      s}     ::w	',,-,,-


 
wzzZ'	( F $$&&   BB1B/B1r<   r3   c           
      @  K   | j                  t        t              j                  t	        t        j
                              j                  t        j                  |k(  t        j                  |k(  t        j                  |k(  t        j                  j                  d                   d{   }|j                         j                         }|D cg c]<  }|j
                  s|j
                  j                  |j
                  j                  d> c}S 7 jc c}w w)z5Return operators scheduled for a specific shift+date.N)r   r   )r   r   r   r1   r	   r)   r    r   r<   r3   r#   r"   r6   r$   r   r%   )r   r   r<   r3   r&   r'   rs          r+   get_jadwal_for_slotrT      s      ::{	k../	0	7*  H,7*""&&t,	

	 	F >>!D<@KDqAFF16699affkk2DKK	 Ls*   B*D,D-&DD%/DDDfoto_urluploaded_by_idfoto_eksif_waktuc           
      f  K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(  t        j                  |k(               d{   }|j                         }t        j                  t        j                        }	|r2||_        ||_        ||_        |	|_        d|_        d|_        d|_        n$t        |||||||	d      }| j'                  |       | j)                          d{    | j+                  |       d{    |S 7 7 !7 
w)zLCreate or replace absensi record for a shift+date. Resets status to pending.Npending)r   r<   r3   rU   rW   rV   uploaded_atstatus)r   r   r
   r    r   r<   r3   r=   r   nowr   utcrU   rW   rV   rZ   r[   reviewed_by_idreviewed_atr>   r@   refresh)
r   r   r<   r3   rU   rV   rW   r&   absensir\   s
             r+   upsert_absensirb      s     ::wOOw&(OOw&	
 F '')G
,,x||
$C##3 !/!"!%"-)	
 	w
((*
**W
N?: s7   A&D1(D+)B"D1D-D1$D/%D1-D1/D1r^   c                 4  K   t        | |       d {   }|r|j                  |k7  ry d|_        ||_        t	        j
                  t        j                        |_        | j                          d {    | j                  |       d {    |S 7 7 !7 
wNapproved)rP   r   r[   r^   r   r\   r   r]   r_   r@   r`   )r   r   rN   r^   ra   s        r+   approve_absensirf      s      &b*55Ggoo0GN+G",,x||4G
((*
**W
N 6 s4   BBAB2B3BBBBBc           
      b  K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                        t	        t        j                              j                  t        j                  |k(  t        j                  |k\  t        j                  |k        j                  t        j                  j                                      d {   }t        |j                         j!                               S 7 +wr0   )r   r   r   r1   r	   rJ   rK   r9   fotosr    r   r3   r4   rL   r5   r6   r$   r7   s        r+   get_housekeepingri      s      ::|	112112++,++,	

 
  G+  E)  C'


 
,&&++-	. F  $$&''s   C?D/D-,D/hk_idc           
        K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                        t	        t        j                              j                  t        j                  |k(               d {   }|j                         S 7 wr0   )r   r   r   r1   r	   rJ   rK   r9   rh   r    r   r=   )r   rj   r&   s      r+   get_housekeeping_by_idrl      s     ::|	112112++,++,	

 
|%'	(	 	F $$&&	s   B0C	2C3C	c           
        K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                        t	        t        j                              j                  t        j                  |k(  t        j                  |k(               d {   }|j                         S 7 wr0   )r   r   r   r1   r	   rJ   rK   r9   rh   r    r   r3   r=   r   r   r3   r&   s       r+   get_housekeeping_slotro      s      ::|	112112++,++,	

 
  G+  G+

 F $$&&s   CCCC	foto_urls	submittedc           	        K   t        | ||       d{   }t        j                  t        j                        }|rdnd}	|r|}
||
_        ||
_        |	|
_        d|
_        d|
_	        t        |
j                        D ]  }| j                  |       d{     t        |
j                        D ]  }| j                  |       d{     | j                          d{    n9t        |||	||      }
| j!                  |
       | j                          d{    t#        |      D ],  \  }}| j!                  t%        |
j&                  ||             . t#        |      D ]-  \  }}| j!                  t)        |
j&                  d||             / | j                          d{    t+        | |
j&                         d{   S 7 7 :7 
7 7 7 /7 w)zOCreate or replace housekeeping for a date. Items and photos are fully replaced.Nre   rY   )r   r3   r[   rV   rZ   )housekeeping_id	deskripsiurutanfoto)rs   tiperU   ru   )ro   r   r\   r   r]   rV   rZ   r[   r^   r_   r5   r9   r   rh   r@   r   r>   	enumerater   r   r   rl   )r   r   r3   rV   r9   rp   rq   rC   r\   
new_statushkrB   rv   irt   urls                   r+   upsert_housekeepingr}     s     +2w@@H
,,x||
$C(iJ*	 ND))D/!! #ND))D/!! #hhj)
 	r
hhj!%(9
STUV )I&3
FSYZ[\ ' ((*'BEE222C A "! 	 2s}   GGB GG2GGG!G"9GGBG(G)GGGGGGGGGc                    K   t        | |       d {   }|r|j                  |k7  ry d|_        | j                          d {    t        | |       d {   S 7 I7 7 wNrY   )rl   r   r[   r@   )r   r   rj   rz   s       r+   back_to_draft_housekeepingr   >  s]      &b%0	0Bw&BI
((*'E222 
1 23   A"A0A"AA"A A"A" A"c                    K   | j                  t        t              j                  t        j                  |k(               d {    | j                          d {    y 7 7 wr0   )r   r   r
   r    r   r@   )r   rN   s     r+   hard_delete_absensir   I  sI     
**VG_**7::+CD
EEE
((* F$   AA&A"A&A$A&$A&c                    K   | j                  t        t              j                  t        j                  |k(               d {    | j                          d {    y 7 7 wr0   )r   r   r   r    r   r@   )r   rj   s     r+   hard_delete_housekeepingr   N  sJ     
**VL)//50HI
JJJ
((* Kr   c                 &  K   t        | |       d {   }|r|j                  |k7  ry d|_        ||_        t	        j
                  t        j                        |_        | j                          d {    t        | |       d {   S 7 x7 7 wrd   )
rl   r   r[   r^   r   r\   r   r]   r_   r@   )r   r   rj   r^   rz   s        r+   approve_housekeepingr   S  sy      &b%0	0Bw&BI&B\\(,,/BN
((*'E222 
1 2s4   BBAB2B3BBBBBc           	      2  K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                              j                  t        j                  |k(  t        j                  |k\  t        j                  |k        j                  t        j                  j                                      d {   }t        |j                         j                               S 7 +wr0   )r   r   r   r1   r	   rJ   rK   r9   r    r   r3   r4   rL   r5   r6   r$   r7   s        r+   
get_saprasr   b  s      ::v	++,++,&


 
NNg%NNe#NNc!


 
&..%%'	( F  $$&''s   C'D)D*,D	sapras_idc           	      f  K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                              j                  t        j                  |k(               d {   }|j                         S 7 wr0   )r   r   r   r1   r	   rJ   rK   r9   r    r   r=   )r   r   r&   s      r+   get_sapras_by_idr   v  s}     ::v	++,++,&


 
vyyI%	& F $$&&rQ   c           	        K   | j                  t        t              j                  t	        t        j
                        t	        t        j                        t	        t        j                              j                  t        j                  |k(  t        j                  |k(               d {   }|j                         S 7 wr0   )r   r   r   r1   r	   rJ   rK   r9   r    r   r3   r=   rn   s       r+   get_sapras_slotr     s      ::v	++,++,&


 
NNg%NNg%

 F $$&&s   B*C,C-Ccatatan
items_datac                 H  K   t        | ||       d{   }t        j                  t        j                        }|rdnd}	|rx|}
||
_        ||
_        ||
_        |	|
_        d|
_	        d|
_
        t        |
j                        D ]  }| j                  |       d{     | j                          d{    n:t        ||||	||      }
| j!                  |
       | j                          d{    t#        |      D ]\  \  }}| j!                  t%        |
j&                  |j)                  dd      |j)                  d      |j)                  d      |	             ^ | j                          d{    t+        | |
j&                         d{   S 7 7 7 7 7 +7 w)
z>Create or replace sapras for a date. Items are fully replaced.Nre   rY   )r   r3   r   r[   rV   rZ   kegiatan foto_sebelum_urlfoto_sesudah_url)r   r   r   r   ru   )r   r   r\   r   r]   r   rV   rZ   r[   r^   r_   r5   r9   r   r@   r   r>   rx   r   r   getr   )r   r   r3   rV   r   r   rq   rC   r\   ry   saprasrB   r{   s                r+   upsert_saprasr     sr     %R'::H
,,x||
$C(iJ  . " $!&D))D/!! 'hhj)
 	vhhjZ(4
ziiXXj"-!XX&89!XX&89
 	 ) ((*!"fii000K ; " 	 0sk   F"FBF"FF"5F6:F"0F1BF"2F3F"F F"F"F"F"F" F"c                    K   t        | |       d {   }|r|j                  |k7  ry d|_        | j                          d {    t        | |       d {   S 7 I7 7 wr   )r   r   r[   r@   )r   r   r   r   s       r+   back_to_draft_saprasr     s]      $B	22FV^^w.FM
((*!"i000 3 0r   c                    K   | j                  t        t              j                  t        j                  |k(               d {    | j                          d {    y 7 7 wr0   )r   r   r   r    r   r@   )r   r   s     r+   hard_delete_saprasr     sI     
**VF^))&))y*@A
BBB
((* Cr   r0   )F)4__doc__r   r   r   
sqlalchemyr   r   sqlalchemy.ext.asyncior   sqlalchemy.ormr	   app.models.general_affairsr
   r   r   r   r   r   r   app.models.roler   r   app.models.userr   intr5   dictr,   r8   rE   boolrH   rM   rP   rT   strrb   rf   ri   rl   ro   r}   r   r   r   r   r   r   r   r   r   r        r+   <module>r      st   K - - % / ' B  B  B 4  
L 3 4: 4(("(+/(6:(	+(  : 	
 
+@L S 3 4 "(("(+/(6:(	']((
' 
'# 
''D. 
'LL"L.1L<@L	$ZL2 $())) ) 	)
 ) ) Dj) )X"03EHt^ (("(+/(6:(	,(*'\ '# ',QUBU '''"'-1'D'4 +3+3+3 +3 	+3
 9+3 Cy+3 +3 +3\33"3+.3D3, C D 
| C D 

3
3"
3+.
3@C
3D
3(("(+/(6:(	&\((
'| 
' 
' 
'''"'-1'd]'2 /1/1/1 /1 	/1
 4Z/1 T
/1 /1 /1d11"1/21d]1 # $ r   