
    }i              
          d dl mZmZmZmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZm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  d dl!m"Z" d dl#m$Z$m%Z%  eddg      Z&de"de'fdZ( G d de      Z) G d de      Z* G d de      Z+ G d de      Z,d  Z-d! Z.d" Z/d#e0d$e'd%ede0fd&Z1d'e0d%ede2fd(Z3d) Z4dYd*e0d%ed+e'de0fd,Z5dYd-ed%ed+e'de6fd.Z7e&jq                  d/      ddd ee      fd0ee9   d1ee'   d2ee'   d%efd3       Z:e&jq                  d4      ddd ee      fd5ee'   d6ee9   d7ee9   d%efd8       Z;e&jq                  d9       ee      fd5e'd%efd:       Z<e&jq                  d;       ee      fd5e'd%efd<       Z=e&jq                  d=       ee      fd5e'd%efd>       Z>e&jq                  d?       ee      fd5e'd%efd@       Z?e&j                  d4       ee      fdAe)d%efdB       ZAe&j                  dC       ee      fdDe'dAe+d%efdE       ZBd-edFe'd%efdGZCe&j                  dH       ee       ee$      fdDe'dAe,d%ede"fdI       ZDe&jq                  dJ       edK       ee       ee%      fdLe9d%efdM       ZEe&jq                  dN       ee       ee%      fdOe'd%efdP       ZFe&j                  dQ       ee       ee%      fdAe*d%efdR       ZGe&j                  dS       ee       ee$      fdDe'd%ede"fdT       ZI G dU dVe      ZJe&j                  dW       ee       ee%      fdAeJd%efdX       ZKy)Z    )	APIRouterDependsHTTPExceptionQuery)Session)OptionalList)	BaseModel)datetime	timedeltaN)get_db)	ShiftSwap)
Assignment)MassSchedule)MassTemplate)SpecialMass)SpecialEvent)Asim)PositionType)User)get_current_userrequire_pengurusz/api/shift-swapszShift Swaps)prefixtagscurrent_userreturnc                 `    | j                   st        dd      | j                   j                  S )uH   Ambil asim_id dari JWT user — raise 403 kalau tidak terhubung ke ASIM.  z!Akun tidak terhubung ke data ASIMstatus_codedetail)asimr   id)r   s    7/var/www/html/asim.com/backend/app/routes/shift_swap.py_get_asim_id_from_userr%      s+    4WXX    c                   b    e Zd ZU eed<   eed<   eed<   dZeee      ed<   dZ	eed<   dZ
eed	<   y)

SwapCreaterequester_idoffer_schedule_idoffer_position_numberNwant_schedule_idsweekly	swap_typeswaprequest_type)__name__
__module____qualname__int__annotations__strr,   r   r	   r.   r0    r&   r$   r(   r(      s<    -1xS	*1IsL#r&   r(   c                   "    e Zd ZU eed<   eed<   y)AdminSwapCreateschedule_idposition_numberNr1   r2   r3   r4   r5   r6   r7   r&   r$   r9   r9   %   s    r&   r9   c                   @    e Zd ZU eed<   dZee   ed<   dZee   ed<   y)TakeSwapRequestasim_idNtaker_schedule_idtaker_position_number)	r1   r2   r3   r4   r5   r@   r   rA   r6   r7   r&   r$   r>   r>   )   s%    L'+x}++/8C=/r&   r>   c                       e Zd ZU eed<   y)ApprovalRequestapprovedN)r1   r2   r3   boolr5   r7   r&   r$   rC   rC   .   s    Nr&   rC   c                 v    | j                         }|dz
  dz  }| t        |      z
  }|t        d      z   }||fS )zGet week range Sabtu-Jumat      days   )weekdayr   )daterL   days_since_saturday
week_startweek_ends        r$   get_week_rangerQ   1   sF    llnG"Q;!+	':;;JI1--Hxr&   c                 \   | sy |j                  t              j                  t        j                  | k(        j	                         }|sy |j
                  r|j                  t              j                  t        j                  |j
                  k(        j	                         }|rM|j                  t              j                  t        j                  |j                  k(        j	                         nd }|r|r|j                   d|j                   nd}|r|j                  nd}nm|j                  t              j                  t        j                  |j                  k(        j	                         }|r|j                  nd}|r|j                  nd}| t        |j                        |||dS )N - Special-Misa Mingguanr:   rM   timelabelr;   )queryr   filterr#   firstspecial_mass_idr   r   event_idnamerX   r   template_idr6   rM   )	r:   r;   dbschedulesmeventrY   rX   templates	            r$   get_schedule_inforf   9   s?   xx%,,\__-KLRRTHXXk"))+..H<T<T*TU[[]Y[&--loo.LMSSUae/45::,c"''+rww#88L)00HDXDX1XY__a!) (x}}c"HMM"* r&   c                 :   t        |      \  }}|j                  t              j                  t              j                  t        j                  | k(  t        j                  dk(  t        j                  |k\  t        j                  |k        j                         }|S )z.Get semua jadwal ASIM dalam week (Sabtu-Jumat)T)
rQ   rZ   r   joinr   r[   r?   is_publishedrM   all)r?   rM   ra   rO   rP   assignmentss         r$   get_asim_schedules_in_weekrl   P   s    )$/J((:&++L9@@g%!!T)Z'X%	
 
ce  r&   rk   exclude_schedule_idra   c                 t   | D cg c]  }|j                   |k7  s| }}|sg S t        |D ch c]  }|j                    c}      }|j                  t              j	                  t        j
                  j                  |            j                         D ci c]  }|j
                  | }}|j                         D cg c]  }|j                  s|j                   }}|j                         D cg c]  }|j                  s|j                   }	}|rh|j                  t              j	                  t        j
                  j                  |            j                         D 
ci c]  }
|
j
                  |
 c}
ni }|	rh|j                  t              j	                  t        j
                  j                  |	            j                         D ci c]  }|j
                  | c}ni }t        |D ch c]  }|j                  s|j                   c}      }|rh|j                  t              j	                  t        j                  j                  |            j                         D ci c]  }|j                  | c}ni }g }|D ]  }|j!                  |j                         }|j!                  |j                        }d}|ro|j                  r,|j!                  |j                        }|r|j"                  nd}n7|j                  r+|j!                  |j                        }|r|j"                  nd}|j%                  |rt'        |j(                        nd||j*                  |r|j,                  n|j                  d        |S c c}w c c}w c c}w c c}w c c}w c c}
w c c}w c c}w c c}w )z<Build week schedule info list dengan batch queries (no N+1).rU   )rM   rX   r;   position_type_label)r:   listrZ   r   r[   r#   in_rj   valuesr`   r]   r   r   position_type_coder   codegetrX   appendr6   rM   r;   rY   )rk   rm   ra   afilteredschedule_idssschedules_maptemplate_idssm_idsttemplates_maprc   sm_mappt_codesptpt_mapresultrb   rX   tmpls                        r$   _build_week_schedule_entriesr   [   s8   &O;a!--;N*N;HO	919:L,/66|7J7J<7XY]]__Aa_   ,9+?+?+AS+AaQ]]AMM+ALS)6)=)=)?U)?A1CTCTa)?FU 
 ,/66|7J7J<7XY]]__Aa_ 
 
 HH[1889K9KF9STXXZZbr	Z  8T8aq?S?SQ))8TUH 
 !hh|4;;L<M<M<Q<QRZ<[\``bbb  F $$Q]]3ZZ,,-##$(()=)=>$(tyyc))ZZ 8 89"$rww#*2C& 00/1288q7K7K	
 	 " MS P : TU UsK   NNNN NN4N!N!)N&N+7N0	N01N5ry   c                    | si i i i fS |j                  t              j                  t        j                  j	                  |             j                         D ci c]  }|j                  | }}t        |j                         D ch c]  }|j                  s|j                   c}      }t        |j                         D ch c]  }|j                  s|j                   c}      }i i }}|r|j                  t              j                  t        j                  j	                  |            j                         }|D 	ci c]  }	|	j                  |	 }}	t        |D 	ch c]  }	|	j                   c}	      }
|
rg|j                  t              j                  t        j                  j	                  |
            j                         D ci c]  }|j                  | }}|rh|j                  t              j                  t        j                  j	                  |            j                         D ci c]  }|j                  | c}ni }||||fS c c}w c c}w c c}w c c}	w c c}	w c c}w c c}w )zBatch-load MassSchedule, SpecialMass, SpecialEvent, MassTemplate for a list of IDs.
    Returns (schedules_map, sm_map, event_map, tmpl_map).)rZ   r   r[   r#   rq   rj   rp   rr   r]   r`   r   r^   r   r   )ry   ra   rz   r{   r}   tmpl_idsr   	event_mapsmsrc   ev_idser~   tmpl_maps                 r$   _load_schedule_cacher      s    2r2~,/66|7J7J<7XY]]__Aa_   m.B.B.DZ.DHYHY1$$.DZ[FM,@,@,BT,BqammQ]],BTUHBIFhh{#**;>>+=+=f+EFJJL&)*c"%%)c*S1Srr{{S12*,((<*@*G*GH[H[\bHc*d*h*h*jk*jQq*jIk 
 ,/66|7J7J87TUYY[[Aa[  &)X55 [T +1ks6   IIII#I#I($I-I2:I7c                    | sy|j                  |       }|sy|j                  rl|j                  |j                        }|r|j                  |j                        nd}|r|r|j                   d|j                   nd}	|r|j                  nd}
n;|j                  |j
                        }|r|j                  nd}	|r|j                  nd}
| t        |j                        |
|	|dS )z?Build schedule info dict from pre-loaded cache (no DB queries).NrS   rT   rU   rV   rW   )ru   r]   r^   r_   rX   r`   r6   rM   )r:   r;   r{   r   r   r   rb   rc   rd   rY   rX   re   s               r$   _schedule_info_from_cacher      s      -HZZ001.0	bkk*d/45::,c"''+rww#<< 4 45!) (x}}c"HMM"* r&   swapsviewer_asim_idc           
      @   | sg S | D cg c]  }|j                   s|j                    }}| D cg c]  }|j                  s|j                   }}t        t        ||z               }|rh|j	                  t
              j                  t
        j                  j                  |            j                         D ci c]  }|j                  | c}ni }| D cg c]  }|j                  s|j                   }	}| D cg c]  }|j                  s|j                   }
}i }g }| D ]N  }|j                  st        j                  |j                        }|||j                  <   |j                  |       P t        t        |	|
z   |z               }t!        ||      \  }}}}i }i }|	rd|j	                  t"              j                  t"        j$                  j                  |	            j                         }i }|D ]  }|||j$                  |j&                  f<    t        |D ch c]  }|j(                  s|j(                   c}      }|rh|j	                  t*              j                  t*        j,                  j                  |            j                         D ci c]  }|j,                  | c}ni }|j/                         D ]B  \  \  }}}|j1                  |j(                        }|r|j2                  n|j(                  |||f<   D i }t               }|r|j	                  t"              j5                  t6              j                  t"        j8                  |k(  t6        j:                  dk(        j                         }|D ci c]#  }|j<                  j                  |j&                  % }}t        |j?                               }g }| D ]$  } | j                   r|j1                  | j                         nd}!| j                  r|j1                  | j                        nd}"g }#|j1                  | j                  g       D ]&  }tA        |d||||      }$|$s|#jC                  |$       ( tA        | j                  | jD                  ||||      }%| j                  r$tA        | j                  | jF                  ||||      nd}&|j1                  | j                  | jD                  f      }'d}(g })|rP|| j                   k7  rA|%r?| j                  |v rd}(n.|#r,|#D ]'  }*|*d   |v s|)jC                  i |*d||*d      i       ) g }+g },|r\|| j                   k7  rM|%rK|j1                  | j                        }-|-r.tI        ||-jJ                  |      }.tM        |.| j                  |      }+| j                  rU|j1                  | j                        }/|/r8tI        | j                   |/jJ                  |      }0tM        |0| j                  |      },|jC                  i d| j                  d| jN                  d| jP                  d	| jR                  xs d
d| jT                  xs dd|'dtW        | jX                        d|!r/|!j                  |!jZ                  |!j\                  |!j^                  dndd|"r$|"j                  |"jZ                  |"j\                  dndd|%d|#d|&d|(d|)d|+d|,d| j`                         ' |S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )uR   Enrich a list of swaps with batch queries — O(queries) instead of O(N×queries).TNconflictr:   my_positionr#   statusr.   r0   r/   posted_by_adminFoffer_position_type_label
created_at	requesterr#   no_asim	full_namephototakerr#   r   r   offerwant_schedulestaker_scheduleconflict_typematching_schedulestaker_week_schedulesrequester_week_schedulesrejection_reason)1r)   taker_idrp   setrZ   r   r[   r#   rq   rj   r*   r@   r,   jsonloadsextendr   r   r:   r;   rs   r   rt   itemsru   rY   rh   r   r?   ri   rb   keysr   rv   r+   rA   rl   rM   r   r   r.   r0   r   r6   r   r   r   r   r   )1r   ra   r   rz   requester_ids	taker_idsall_asim_idsrw   asim_map	offer_idstaker_ids_schedswap_want_mapwant_ids_allidsall_sched_idsr{   r   r   r   offer_assign_mappt_label_mapoffer_assignmentsraw_assign_mapr   r   r   sidpnumviewer_schedule_mapviewer_offer_conflict_idsviewer_assignmentsresultsr/   r   r   r   info
offer_info
taker_infor   r   r   wr   r   offer_schedule_objviewer_weektaker_schedule_objreq_weeks1                                                    r$   _enrich_swaps_batchr      s'   	 .3EUannQ^^UME%*9UajjUI9MI567L\h$!6!6tww{{<7P!Q!U!U!WX!WAa!WXnpH /4Keq7J7J$$eIK49QEqQ=P=Pq**EOQML**Q001C"%M!$$$	 
 Y8<GHIM1EmUW1X.M69h LHHZ077""&&y1

#% 	 "AABNAMM1+<+<=> #7Ha7H!AL`L`--7Habqy(>(E(ElFWFWF[F[\dFe(f(j(j(lm(l""''2+(lm  @B,224NKS$A001B46A<P<PL#t% 5
  #XXj166|DKK.0%%-
 #% 	 J\\I[Aqzz}}a.?.??I[\$'(;(@(@(B$C!G7;7H7HHLL!2!23d	/3}}T]]+$ $$TWWb1C,S$vyZbcD%%d+ 2
 /""D$>$>vW`bj


 ## /""D$>$>vW`bj
)- 	 %1$4$4##T%?%?@%
!
 n0A0AAj%%)BB *'A'+>>*11 33)+>q?O+P3  (  "#% n0A0AAj!.!2!243I3I!J!8I[I`I`bde'CKQUQgQgik'l$!!!.!2!243I3I!J!5d6G6GI[I`I`bde+GRVRhRhjl+m( 
$''
dkk
 
 D--7	

 t33<u
 ()B
 #doo.
 
 	  ll$,,&00"	
 !%
   hh =="__ !%
& Z'
( n)
* j+
, ]-
. !"4/
0 #$81
2 '(@3
4  5 55
 	c Z Nw F9X LQ* bm ]sK   [8[8[=[=;\\*\>\\%\7\\(\r/   c                 |   | j                   rM|j                  t              j                  t        j                  | j                   k(        j                         nd }| j                  rM|j                  t              j                  t        j                  | j                  k(        j                         nd }g }| j                  rGt        j                  | j                        }|D ]#  }t        |d |      }|s|j                  |       % t        | j                  | j                  |      }	| j                  r!t        | j                  | j                  |      nd }
d }| j                  r| j                  r|j                  t               j                  t         j"                  | j                  k(  t         j$                  | j                  k(        j                         }|rg|j                  t&              j                  t&        j(                  |j*                  k(        j                         }|r|j,                  n|j*                  }d }g }|r`|| j                   k7  rP|	rM|j                  t               j/                  t0              j                  t         j2                  |k(  t0        j                  | j                  k(  t0        j4                  dk(        j                         }|rd}n|r|j                  t               j/                  t0              j                  t         j2                  |k(  t0        j4                  dk(        j7                         }|D ci c]#  }|j8                  j                  |j$                  % }}|D ]'  }|d   |v s|j                  i |d||d      i       ) g }|r|| j                   k7  r|	r}|j                  t0              j                  t0        j                  | j                  k(        j                         }|r.t;        ||j<                  |      }t?        || j                  |      }g }| j                  r|j                  t0              j                  t0        j                  | j                  k(        j                         }|r8t;        | j                   |j<                  |      }t?        || j                  |      }i d| j                  d| j@                  d| jB                  d| jD                  xs d	d
| jF                  xs dd|dtI        | jJ                        d|r/|j                  |jL                  |jN                  |jP                  dnd d|r$|j                  |jL                  |jN                  dnd d|	d|d|
d|d|d|d|d| jR                  S c c}w )NTr   r:   r   r#   r   r.   r0   r/   r   Fr   r   r   r   r   r   r   r   r   r   r   r   r   r   )*r)   rZ   r   r[   r#   r\   r   r,   r   r   rf   rv   r*   r+   r@   rA   r   r:   r;   r   rt   rs   rY   rh   r   r?   ri   rj   rb   rl   rM   r   r   r.   r0   r   r6   r   r   r   r   r   )r/   ra   r   r   r   r   r   r   r   r   r   r   offer_assignmentr   r   r   	same_massr   rw   r   r   r   r   r   r   r   req_week_assignmentss                              r$   enrich_swapr   9  sZ   OSO`O`%%dgg1B1B&BCIIKfjIGK}}BHHTN!!$''T]]":;AACZ^ENjj//0C$S$3D%%d+ 
 #4#9#94;U;UWYZJ^b^t^t"4#9#94;U;UWYZz~J !%$"<"<88J/66""d&<&<<&&$*D*DD
 %' 	 ,'..|/@/@DTDgDg/ghnnpB46<L<_<_% M.D,=,==*HHZ(--l;BB.0OOt555%%-
 %'	 	
 &M %'XXj%9%>%>|%L%S%S&&.8 --5& #% # Rd&dQcAqzz}}a6G6G'GQc#&d'A'+>>*11 33)+>q?O+P3  ( .D,=,==*XXl3::<??dNdNd;dekkm4^EWE\E\^`aK#?TMcMceg#h   ",/66|$J`J`7`aggi#=d>O>OQ_QdQdfh#i 'CDXZ^ZpZprt'u$dgg$++ 	T^^ 	))3V	
 	4//85 	$%> 	c$//* 	
 	 ,, ((",,__	

 ! 	  ((}}
 %& 	'( 	.)* 	*+, 	-. 	0/0 	 412 	#$<34 	D115 1 'es   (V9z/monitorr   monthyearc                    ddl m} ddl}|j                  t              }| r'| dk7  r"|j                  t        j                  | k(        }|r]|r[ |||d      } ||||j                  ||      d         }|j                  t        j                  |k\  t        j                  |k        }|j                  t        j                  j                               j                         }	t        |	|      S )u;   Monitoring semua tukar tugas — untuk pengurus/super_adminr   rM   Nrj      )r   rM   calendarrZ   r   r[   r   
monthranger   order_bydescrj   r   )
r   r   r   ra   rM   calq	first_daylast_dayr   s
             r$   monitor_swapsr     s     
A&E/HHY%%/0ua(	eS^^D%%@%CDHHY))Y6	8L8LPX8XYJJy++0023779Eub))r&   /r?   	date_fromdate_toc                 :   ddl m} |j                  t              j	                  t
        t        j                  t
        j                  k(        j                  t        j                  dk(        }|r1|j                  t
        j                  |j                  |      k\        }|r1|j                  t
        j                  |j                  |      k        }|j                  t
        j                  j                               j                         }t        |||       S )Nr   r   open)r   rM   rZ   r   rh   r   r*   r#   r[   r   fromisoformatr   ascrj   r   )r?   r   r   ra   	date_typer   r   s          r$   	get_swapsr     s     +
  y/J/Jloo/]^eeF"	A HH\&&)*A*A)*LLMHH\&&)*A*A'*JJKJJ|((,,./335Eub'22r&   z/my-requestsc                     |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }t        |||       S N)	rZ   r   r[   r)   r   r   r   rj   r   r?   ra   r   s      r$   get_my_requestsr     s\    HHY&&')hy##((*+CCE 
 ub'22r&   z/pending-approvalc                    |j                  t              j                  t        j                  | k(  t        j                  dk(        j                  t        j                  j                               j                         }t        |||       S )Npending_approval)
rZ   r   r[   r)   r   r   r   r   rj   r   r   s      r$   get_pending_approvalr     sm    HHY&&').. hy##((*+CCE 
 ub'22r&   z/pending-for-mec                 8   |j                  t              j                  t        j                  | k(  t        j                  j                  g d            j                  t        j                  j                               j                         }t        |||       S )N)r   	completedrejected	cancelled)rZ   r   r[   r   r   rq   r   r   r   rj   r   r   s      r$   get_pending_for_mer     ss    HHY&&g%WX hy##((*+CCE 
 ub'22r&   z/notification-countc                    ddl m}m} |j                  t              j                  t        j                  | k(  t        j                  dk(        j                         }|j                  t        j                  |j                  t        j                        j                  d            j                  t        j                  | k(  t        j                  j                  ddg            j                  t        j                        j                         }|D ci c]  }|j                  |j                   }}|j!                  dd      }|j!                  dd      }	ddlm}
 t#        j&                         t)        d	      z
  }|j                  t              j                  t        j                  | k(  t        j                  d
k(  t        j*                  |k\        j                         }||z   |	z   |z   |||	|dS c c}w )Nr   )funccaser   cntr   r   r   rH   rI   r   )countpendingr   cancelled_for_mecompleted_recent)
sqlalchemyr   r   rZ   r   r[   r)   r   r   r#   rY   r   rq   group_byrj   r   ru   r   rM   nowr   completed_at)r?   ra   r   r   r   
taker_rowsrow	taker_mapr   r   dt_typeweek_agor   s                r$   get_notification_countr    s   %hhy!((').. eg 
 

9<< &&u- fg%j+67 hy   1;;
SWW$
I;}}Z+H }}[!4(||~	q 11Hxx	*11g%K'(* eg	  8#&669II,,  <s   G<datac           
         |j                  t              j                  t        j                  | j                  k(        j                         }|st        dd      |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(  t        j                  | j                  k(        j                         }|st        dd      |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(  t        j                  dk(        j                         }|rt        dd      t        | j                  | j                  | j                  | j                  rt!        j"                  | j                        nd | j$                  | j&                  dd	      }|j)                  |       	 |j+                          |j-                  |       t3        ||      S # t.        $ r |j1                          t        d
d      w xY w)N  zJadwal tidak ditemukanr     zJadwal ini bukan milik Anda!r   zJadwal ini sudah ada di bursa!F)r)   r*   r+   r,   r.   r0   r   r     z#Gagal menyimpan request tukar tugas)rZ   r   r[   r#   r*   r\   r   r   r:   r;   r+   r?   r)   r   r   r,   r   dumpsr.   r0   addcommitrefresh	Exceptionrollbackr   )r  ra   offer_schedule
assignmentexistingr/   s         r$   create_swapr    s   XXl+22<??dF\F\3\]cceN4LMM*%,,$"8"88""d&@&@@d/// eg	 
 4RSSxx	"))##t'='==''4+E+EEF" eg	 
 4TUU&&00"88@D@V@V$**T%;%;<\`..&&	D FF4L[
		


4 tR    [
4YZZ[s   =!H* *'Iz/{swap_id}/takeswap_idc                    |j                  t              j                  t        j                  | k(        j	                         }|r|j
                  dk7  rt        dd      |j                  r&|j                  |j                  k(  rt        dd      |j                  t              j                  t        j                  |j                  k(  t        j                  |j                  k(        j	                         }|rt        dd      d}|j                  d	k7  r|j                  r|j                  t              j                  t        j                  |j                  k(        j	                         }|rNt        |j                  |j                   |      }|D cg c]  }|j                  |j                  k7  s|  }}|rd
}|j                  |_        |j                  |_        |j$                  |_        |rd|_        	 |j'                          dd
dS t-        ||j                  |       dddS c c}w # t(        $ r |j+                          t        dd      w xY w)Nr   r	  z*Request tidak ditemukan atau sudah diambilr   r
  z%Tidak bisa mengambil request sendiri!z Anda sudah bertugas di misa ini!FreplaceTr   r  z$Gagal menyimpan proposal tukar tugasz5Request dikirim! Menunggu persetujuan dari requester.)messageneeds_approvalzTukar tugas berhasil!)rZ   r   r[   r#   r\   r   r   r)   r?   r   r:   r*   r0   r@   r   rl   rM   r   rA   r  r  r  _do_swap)	r  r  ra   r/   r   r  r   r   rw   s	            r$   	take_swapr  (  s
   88I%%illg&=>DDFD4;;&(4`aaT..$,,>4[\\ $++$"8"88dll* eg  4VWW NI%$*@*@,/66|$J`J`7`aggi#=d>O>OQ_QdQdfh#i /C#o/C!q}}X\XnXnGnA/C #o#!%LLDM!33D!%!;!;D(	`IIK Sfjkkt||R(2eLL% $p  	`KKMC8^__	`s   H4<H4H9 9'I taker_asim_idc                 L   |j                  t              j                  t        j                  | j                  k(  t        j
                  | j                  k(        j                         }|r||_        d|_	        | j                  rC| j                  r6|j                  t              j                  t        j                  | j                  k(  t        j
                  | j                  k(        j                         }|r| j                  |_        d|_	        |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(  t        j                  j                  ddg      t        j                   | j                   k7        j#                         }|D ]	  }d|_         d| _        t%        j&                         | _        	 |j+                          y # t,        $ r |j/                          t1        dd      w xY w)	NTr   r   r   r   r  zGagal menyelesaikan tukar tugasr   )rZ   r   r[   r:   r*   r;   r+   r\   r?   is_overrider@   rA   r)   r   r   rq   r#   rj   r   r   r   r  r  r  r   )r/   r  ra   r   taker_assignmentstale_swapsrz   s          r$   r  r  S  s   xx
+22$"8"88""d&@&@@ eg  #0 '+$$"<"<88J/66""d&<&<<&&$*D*DD
 %' 	 '+'8'8$+/( hhy)00''4+A+AA++t/I/II  &*<!=>LLDGG#	

 #% 	 A"AH  DK DW
		 W
4UVVWs   +G< <'H#z/{swap_id}/approvec                 
   |j                  t              j                  t        j                  | k(        j	                         }|r|j
                  dk7  rt        dd      |j                  dk(  r't        |      }|j                  |k7  rt        dd      |j                  rt        ||j                  |       dd	iS d
|_        	 |j                          ddiS # t        $ r |j                          t        dd      w xY w)Nr   r	  Request tidak ditemukanr   r"   r   Bukan request milikmur  zSwap disetujui dan berhasil!r   r  zGagal menolak swapzSwap ditolak.)rZ   r   r[   r#   r\   r   r   roler%   r)   rD   r  r   r  r  r  )r  r  ra   r   r/   
my_asim_ids         r$   approve_swapr'  w  s     88I%%illg&=>DDFD4;;"444MNN F"+L9

*C8OPP}}t}}b)9:: 	NIIK ?++  	NKKMC8LMM	Ns   C 'Dz/admin/schedules.rM   c                    ddl m} |j                  |       }|j                  t              j                  t        j                  |k(  t        j                  dk(        j                         }g }|D ]E  }t        |j                  d|      }|s|j                  |j                  |d   |d   |d   d       G t        |d	 
      S )z?Ambil semua jadwal published pada tanggal tertentu untuk admin.r   r   TNrM   rX   rY   )r#   rM   rX   rY   c                     | d   S )NrX   r7   xs    r$   <lambda>z%admin_get_schedules.<locals>.<lambda>  s    &	r&   key)r   rM   r   rZ   r   r[   ri   rj   rf   r#   rv   sorted)	rM   ra   _	dt_moduled	schedulesr   rz   r   s	            r$   admin_get_schedulesr4    s     +%A&--Q!!T) 
ce  F tR0MMtF|T&\\`ah\ijk  &122r&   z*/admin/schedules/{schedule_id}/assignmentsr:   c           
         |j                  t              j                  t        j                  | k(        j	                         }|sg S |D cg c]  }|j
                  s|j
                   }}t        |D ch c]  }|j                  s|j                   c}      }|rh|j                  t              j                  t        j                  j                  |            j	                         D ci c]  }|j                  | c}ni }|rh|j                  t              j                  t        j                  j                  |            j	                         D ci c]  }|j                  | c}ni }	g }
|D ]  }|j
                  r|j                  |j
                        nd}|	j                  |j                        }|
j                  |j                  |j                  |r|j                   n|j                  |j
                  |r|j"                  nd|r|j$                  ndd        |
j'                  d        |
S c c}w c c}w c c}w c c}w )uU   Ambil semua posisi dalam sebuah jadwal beserta siapa yang bertugas — batch queries.N)r;   rs   ro   r?   	asim_namer   c                 Z    t        | d         j                         rt        | d         S dS )Nr;   r   )r6   isdigitr4   r*  s    r$   r,  z'admin_get_assignments.<locals>.<lambda>  s.    3qAR?S;T;\;\;^c!$5"67edeer&   r-  )rZ   r   r[   r:   rj   r?   rp   rs   r   r#   rq   r   rt   ru   rv   r;   rY   r   r   sort)r:   ra   r0  rk   rw   asim_idsr   r   r   r   r   r"   s               r$   admin_get_assignmentsr;    s    ((:&--j.D.D.STXXZK	 $/<;a!))		;H<;W;a!BVBVQ));WXHX`$!6!6tww{{87L!M!Q!Q!ST!SAa!STfhHmuBHH\$:$A$A,BSBSBWBWX`Ba$b$f$f$hi$hbbggrk$hi{}FF*+))x||AII&ZZ,,- 00"#"6"6/1288q7K7Kyy+/T'+t||
 	  KKeKfM' =WTis$   II7I	I1IIz/admin-postc           	         |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(        j                         }|st        dd      |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(  t        j                  dk(        j                         }|rt        dd      |j                  t              j                  t        j                  | j                  k(        j                         }|r|j                  rdnd}t        |j                  | j                  | j                  |dd	d
      }|j                  |       	 |j!                          |j#                  |       t)        ||      S # t$        $ r |j'                          t        dd      w xY w)zAdmin post ke bursa atas nama ASIM/Suster yang bertugas di posisi tersebut.
    Jika posisi tidak memiliki ASIM (mis. SR/Suster), requester_id = null.r
  z%Posisi tidak ditemukan di jadwal ini!r   r   zPosisi ini sudah ada di bursa!specialr-   r  T)r)   r*   r+   r.   r0   r   r   r  zGagal post ke bursa)rZ   r   r[   r:   r;   r\   r   r   r*   r+   r   r   r#   r]   r?   r  r  r  r  r  r   )r  ra   r0  r  r  rb   r.   r/   s           r$   admin_post_swapr>    s    *%,,$"2"22""d&:&:: eg  4[\\xx	"))##t'7'77''4+?+??F" eg	 
 4TUUxx%,,\__@P@P-PQWWYH%(*B*B	I''**"22D FF4LK
		


4 tR    K
4IJJKs   $!G 'G8z
/{swap_id}c                 ,   |j                  t              j                  t        j                  | k(  t        j                  j                  ddg            j                         }|st        dd      |j                  |j                  dvrCt        dd      |j                  d	k(  r't        |      }|j                  |k7  rt        dd
      d|_        	 |j                          ddiS # t        $ r |j                          t        dd      w xY w)Nr   r   r	  r#  r   )pengurussuper_adminr   z-Hanya admin yang bisa membatalkan request inir"   r$  r   r  zGagal membatalkan requestr  zRequest dibatalkan)rZ   r   r[   r#   r   rq   r\   r   r)   r%  r%   r  r  r  )r  ra   r   r/   r&  s        r$   cancel_swaprB    s    88I%%f&89: eg 	 4MNN  $??C8ghh &/=J  J.#<STTDKQ
		 +,,  Q
4OPPQs   C, ,'Dc                   6    e Zd ZU eed<   eed<   eed<   eed<   y)AdminManualSwapCreateschedule_a_id
position_aschedule_b_id
position_bNr<   r7   r&   r$   rD  rD    s    OOr&   rD  z/admin-manual-swapc                 z   |j                  t              j                  t        j                  | j                  k(  t        j
                  | j                  k(        j                         }|j                  t              j                  t        j                  | j                  k(  t        j
                  | j                  k(        j                         }|r|st        dd      |j                  |j                  k(  rt        dd      |j                  t              j                  t        j                  | j                  k(        j                         }|r|j                  rdnd}|j                  }|j                  }||_        d|_        ||_        d|_        t!        || j                  | j                  || j                  | j                  |d	dd
t#        j$                               }	|j'                  |	       	 |j)                          ddiS # t*        $ r |j-                          t        dd      w xY w)uL   Admin langsung tukar dua jadwal tanpa melalui bursa — untuk kasus offline.r	  zPosisi tidak ditemukanr   r
  z$Kedua posisi memiliki ASIM yang samar=  r-   Tr/   r   )r)   r*   r+   r   r@   rA   r.   r0   r   r   r   r  zGagal melakukan pertukaranr  zPertukaran berhasil dilakukan)rZ   r   r[   r:   rE  r;   rF  r\   rG  rH  r   r?   r   r#   r]   r  r   r   r   r  r  r  r  )
r  ra   r0  assignment_aassignment_b
schedule_ar.   asim_aasim_br/   s
             r$   admin_manual_swaprO    s    88J'..$"4"44""doo5 eg  88J'..$"4"44""doo5 eg 
 |4LMM|3334Z[[,'..|$BTBT/TU[[]J(Z-G-G	hI!!F!!F "L#L!L#L ,,"oo,,"oo\\^D FF4LR
		 677  R
4PQQRs   ?H 'H:r   )Lfastapir   r   r   r   sqlalchemy.ormr   typingr   r	   pydanticr
   r   r   r   app.databaser   app.models.shift_swapr   app.models.assignmentr   app.models.mass_scheduler   app.models.mass_templater   app.models.special_massr   app.models.special_eventr   app.models.asimr   app.models.position_typer   app.models.userr   app.core.securityr   r   routerr4   r%   r(   r9   r>   rC   rQ   rf   rl   rp   r   tupler   r   r   dictr   ru   r6   r   r   r   r   r   r  postr  r  r  r'  r4  r;  r>  deleterB  rD  rO  r7   r&   r$   <module>rd     s   < < " !  (   + , 1 1 / 1   1   @	,M?	C   #   i 0i 0
i  .	+d + +RY +^b +Z6t 6 6U 6,0At A A# AQU AF`i `W `c `T `D J &/	*SM*C=* 3-* 		* *0 C!#!&/	3c]3}3 c]3 		3 3" N07 3S 3g 3 3  5<V_ 3# 37 3 !3 3:6? 3 3 3 3 !"7>v C W  #B S07 &!j &!g &! &!P AH (Ms (M/ (Mw (M  (MT"W9 "WS "Wg "WH !" &/ !12	,,
, 	, 	, #,8 $)#JgfoQXYiQj 3c 3G 3  3  89:A&/WUeMf s   :: ]9@GTdLe %!/ %!w %! %!P | &/ !12--- - -@I  !"AHT[\lTm 081 08w 08 #08r&   