
    pi7B                     F   S SK JrJr  S SKJrJrJr  S SKJrJ	r	J
r
Jr  S SKJr  SSKJrJrJr  SSKJr  S\S	\
\\4   4S
 jrS\S\S	\\   4S jr       S7S\S\S\S\\   S\\   S\\   S\\   S\\   S	\
\\4   4S jjr     S8S\S\\   S\\   S\\   S\\   S\\   S	\	\
\\4      4S jjrS9S\S\S\\   S	\	\   4S jjrS9S\S\S\\   S	\4S jjr          S:S\S\S\S\\   S\\   S\S\\   S\\   S \\   S!\\   S\\   S\S"\S	\4S# jjrS\S\S	\4S$ jrS\S\S	\4S% jrS\S\4S& jrS\S\S	\	\
\\4      4S' jr S;S\S\S\S"\S	\4
S( jjr!S\S\S\S	\4S) jr"S\S\S\S"\S	\4
S* jr#S\S\S+\	\   S	\
\\	\   4   4S, jr$S\S\S	\	\   4S- jr%   S<S\S\\   S\\   S\\   S	\	\
\\4      4
S. jjr&     S8S\S\S/\S0\\   S1\\   S!\\   S\\   S\\   S	\4S2 jjr'S\S3\S	\4S4 jr(S\S\S\\   S\\   S	\\   4
S5 jr)S\S\4S6 jr*g)=    )Session
joinedload)funcand_or_)OptionalListDictAny)datetime   )ReservationReservationStudentJugadorGasto)Userreservationreturnc                 *   U (       d  g0 SU R                   _SU R                  _SU R                  _SU R                  _SU R                  _SU R
                  _SU R                  _S	U R                  _S
U R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _S/ _S0 _S0 _n0 nU R                  (       a>  U R                   H.  nUR                  (       d  M  UR                  X#R                  '   M0     U R                   (       Gaf  U R                    GHU  nUR"                  (       d  M  UR"                  R                   UR"                  R                  UR"                  R                  UR"                  R$                  UR"                  R&                  UR                  UR)                  UR"                  R                   S5      S.nUS   R+                  U5        UR                  (       a%  SUS   [-        UR"                  R                   5      '   UR"                  R                   U;   d  GM  X$R"                  R                      US   [-        UR"                  R                   5      '   GMX     U$ )zDConvert Reservation ORM object to dictionary matching the old formatNid
created_atdatetimeduration_minutesprice_centsnameemailphonenotesuser_idstatus
docente_idpaidstudentsstudent_paymentsper_student_centsr   )r   r   r   
first_name	last_namer"   amount_centsT)r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   gastosr(   r#   userr&   r'   getappendstr)r   dataexpense_mapgrss_datas         B/home/mario/Escritorio/thel4footbal/app/models/reservation_crud.pyreservation_to_dictr4   
   sb   knnk,, 	   	  	
 	K88 	{.. 	   	"" 	"" 	"" 	;&& 	+$$ 	k,, 	   	B  	B!" 	R#D* K##Ayyy)*II& $
 &&Bwww''**GGLLWW]]"$''"4"4!#!2!2GG$/OOBGGJJ$B Z ''/ 77@DD+,S_= 77::,ALWWZZAXD,-c"''**o>' '* K    dbreservation_idc                 >   U R                  [        5      R                  [        [        R                  5      R                  [
        R                  5      [        [        R                  5      5      R                  [        R                  U:H  5      R                  5       $ )z(Get reservation by ID with eager loading)queryr   optionsr   r#   r   r*   r)   filterr   firstr6   r7   s     r3   get_reservation_by_idr>   D   sg    88K ((;''(334F4K4KL;%%& f[^^~-.uuw7r5   Npagesizer   r!   r    	date_fromdate_toc                    U R                  [        5      nUb"  UR                  [        R                  U:H  5      nUb"  UR                  [        R                  U:H  5      nUb"  UR                  [        R
                  U:H  5      nU(       a"  UR                  [        R                  U:  5      nU(       a"  UR                  [        R                  U:*  5      nUR                  5       n	US-
  U-  n
U	(       a  [        SX-   S-
  U-  5      OSnUR                  [        R                  R                  5       [        R                  R                  5       5      R                  [        [        R                  5      R                  [         R"                  5      [        [        R$                  5      5      R'                  U
5      R)                  U5      R+                  5       nU Vs/ s H  n[-        U5      PM     snUUU	US.S.$ s  snf )z/Get paginated list of reservations with filters   )r?   r@   totalpages)itemsmeta)r9   r   r;   r   r!   r    r   countmaxorder_byr   descr   r:   r   r#   r   r*   r)   offsetlimitallr4   )r6   r?   r@   r   r!   r    rA   rB   r9   rE   rM   rF   rG   rs                 r3   get_reservations_paginatedrQ   M   s    HH[!E [00G;<[33zAB[//69:[--:;[--89 KKME Qh$F27CEL1$-.QE NN;11668+..:M:M:OP'{334??@R@W@WX{112 &.%+#% 
 388%Q%a(%8	
 8s   !Hc                 Z   U R                  [        5      nUb"  UR                  [        R                  U:H  5      nUb"  UR                  [        R                  U:H  5      nUb"  UR                  [        R
                  U:H  5      nU(       a"  UR                  [        R                  U:  5      nU(       a"  UR                  [        R                  U:*  5      nUR                  [        [        R                  5      R                  [        R                  5      [        [        R                  5      5      nUR                  [        R                  R                  5       [        R                   R                  5       5      R#                  5       nU Vs/ s H  n[%        U5      PM     sn$ s  snf )z5Get list of reservations with filters (non-paginated))r9   r   r;   r   r!   r    r   r:   r   r#   r   r*   r)   rK   r   rL   r   rO   r4   )	r6   r   r!   r    rA   rB   r9   rG   rP   s	            r3   get_reservationsrS      s<    HH[!E [00G;<[33zAB[//69:[--:;[--89 MM;''(334F4K4KL;%%&E
 NN;11668+..:M:M:OPTTVE,12Eq"E222s   F(r   c           	      x   U R                  [        5      R                  [        [        R                  U:H  U(       a;  [
        R                  " [        R                  5      [
        R                  " U5      :H  OS5      5      nUR                  5       nU R                  [        5      R                  [        [        R                  [        R                  :H  5      R                  [        R                  U:H  5      R                  5       n0 nXE-    H  nXvUR                  '   M     [        UR                  5       5      $ )zY
Get all reservations for a user.
Checks user_id, reservation_students table, and email.
F)r9   r   r;   r   r   r   lowerr   rO   joinr   r7   r   listvalues)r6   r   r   r9   direct_reservationsstudent_reservationsall_reservationsrP   s           r3   get_reservations_by_userr\      s     HH[!((7*BGDJJ{(()TZZ->>U	
E  ))+ 88K055))[^^; f''723CCE   7!" 8  '')**r5   c                    U R                  [        5      R                  [        [        R                  U:H  U(       a;  [
        R                  " [        R                  5      [
        R                  " U5      :H  OS5      5      R                  5       nU R                  [        5      R                  [        [        R                  [        R                  :H  5      R                  [        R                  U:H  5      R                  5       n[        S U R                  [        R                  5      R                  [        [        R                  U:H  U(       a;  [
        R                  " [        R                  5      [
        R                  " U5      :H  OS5      5      R                  5        5       5      n[        S U R                  [        R                  5      R                  [        [        R                  [        R                  :H  5      R                  [        R                  U:H  5      R                  5        5       5      n[        XV-  5      $ )z#Count total reservations for a userFc              3   8   #    U  H  oR                   v   M     g 7fNr   .0rP   s     r3   	<genexpr>*count_user_reservations.<locals>.<genexpr>   s       $aTT $   c              3   8   #    U  H  oR                   v   M     g 7fr_   r`   ra   s     r3   rc   rd      s      ; %:qdd %:re   )r9   r   r;   r   r   r   rU   r   rI   rV   r   r7   r   setrO   len)r6   r   r   direct_countstudent_count
direct_idsstudent_idss          r3   count_user_reservationsrm      s    88K(//7*BGDJJ{(()TZZ->>U	

 eg  HH[)..))[^^; f''723EEG   288KNN#;#B#B7*BGDJJ{(()TZZ->>U	
$
 
ce$  J  ;BHH[^^$<$A$A))[^^;% f''723CCE%: ; ;K
 z'((r5   r   r   r   r   r   r   r   r"   c                     [        UUUUUUUU	U
UUUS9nU R                  U5        U R                  5         U R                  U5        UR                  $ )z*Create a new reservation and return its ID)r   r   r   r   r   r   r   r   r   r    r!   r"   )r   addcommitrefreshr   )r6   r   r!   r   r   r   r   r   r   r   r   r    r"   r   s                 r3   create_reservationrr      s_      )K FF;IIKJJ{>>r5   c                 (   U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  gUR                  5        H#  u  pE[        X45      (       d  M  [        X4U5        M%     U R                  5         g)zUpdate reservation fieldsFT)	r9   r   r;   r   r<   rG   hasattrsetattrrp   )r6   r7   kwargsr   keyvalues         r3   update_reservationry     sh    ((;'..{~~/OPVVXKlln
;$$Ke, % IIKr5   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  gU R                  U5        U R                  5         g)zDelete a reservationFT)r9   r   r;   r   r<   deleterp   )r6   r7   r   s      r3   delete_reservationr|     sK    ((;'..{~~/OPVVXKIIkIIKr5   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5         U R                  5         g)z"Delete all reservations for a userN)r9   r   r;   r   r{   rp   r6   r   s     r3   delete_reservations_by_userr      s6    HH[  !4!4!?@GGIIIKr5   c           	         U R                  [        [        R                  5      R	                  [        [        R
                  [        R                  :H  5      R                  [        R                  U:H  5      R                  [        R                  " [        R                  [        R                  5      5      R                  5       n/ nU H  u  pEU R                  [        5      R                  [!        [        R                  U:H  [        R
                  UR                  :H  5      5      R#                  5       nU(       a  UR$                  OSnUR'                  UR                  UR                  UR                  UUS.5        M     U$ )z4Get all students for a reservation with payment infor   )r   r   r   r"   r(   )r9   r   r   r"   rV   r   r   r;   r7   rK   r   coalescer   r   rO   r   r   r<   r(   r,   )r6   r7   resultsr#   r*   r"   expenser(   s           r3   get_reservation_studentsr   (  s    hht/445::""dgg- f...@Aht}}TYY

34SSU	  H
((<(//++~=$$/

 %' 	 07w++A''IIZZ(
 	 & Or5   c                 (   U R                  [        5      R                  [        [        R                  U:H  [        R
                  U:H  5      5      R                  5       nU(       a  g[        UUUS9nU R                  U5        U R                  5         g)zAdd a student to a reservationFr7   r   r"   T)	r9   r   r;   r   r7   r   r<   ro   rp   )r6   r7   r   r"   existingr1   s         r3   add_student_to_reservationr   H  s     xx*+22--?&&'1	

 eg  	%
B
 FF2JIIKr5   c                     U R                  [        5      R                  [        [        R                  U:H  [        R
                  U:H  5      5      R                  5       nU R                  5         US:  $ )z#Remove a student from a reservationr   )r9   r   r;   r   r7   r   r{   rp   )r6   r7   r   deleteds       r3   remove_student_from_reservationr   _  sa    hh)*11--?&&'1	

 fh  IIKQ;r5   c                     U R                  [        5      R                  [        [        R                  U:H  [        R
                  U:H  5      5      R                  5       nU(       d  gX4l        U R                  5         g)z4Update payment status for a student in a reservationFT)	r9   r   r;   r   r7   r   r<   r"   rp   )r6   r7   r   r"   r1   s        r3   update_student_payment_statusr   k  se    	$	%	,	,--?&&'1	


 eg  GIIKr5   new_student_idsc                 J   U R                  [        5      R                  [        R                  U:H  5      R	                  5       n[        S U 5       5      n[        U5      nXT-
  nXE-
  nU(       ai  U R                  [        5      R                  [        [        R                  U:H  [        R                  R                  U5      5      5      R                  SS9  U H  n[        UUSS9n	U R                  U	5        M!     U R                  5         [        U5      [        U5      S.$ )z
Sync students for a reservation: add new ones, remove missing ones.
Returns dict with 'added' and 'removed' lists of user_ids.
c              3   8   #    U  H  oR                   v   M     g 7fr_   )r   )rb   r1   s     r3   rc   ,sync_reservation_students.<locals>.<genexpr>  s     <+;Rjj+;re   F)synchronize_sessionr   r   )addedremoved)r9   r   r;   r7   rO   rg   r   r   in_r{   ro   rp   rW   )
r6   r7   r   current_studentscurrent_idsnew_idsto_add	to_removeuidr1   s
             r3   sync_reservation_studentsr   |  s    xx 23::;M;\;\`n;nossu<+;<<K/"G "F%I 
#$++"11^C"**..y9	

 &U&
+ )

 	r
  IIK&\d9o>>r5   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       $ )z(Get all expenses linked to a reservation)r9   r   r;   r7   rO   r=   s     r3   get_expenses_by_reservationr     s0    88L!(()D)D)VW[[]]r5   c                    U R                  [        [        R                  R	                  S5      [        R
                  R	                  S5      5      R                  [        [        R                  [        R                  :H  5      nU(       a"  UR                  [        R                  U:  5      nU(       a"  UR                  [        R                  U:*  5      nUb"  UR                  [        R                  U:H  5      nUR                  [        R                  R                  5       [        R                  R                  5       5      R                  5       n/ nU H}  u  pxn	UR                  UR                  UR                  UR                  UR                  UU	UR                   UR"                  UR$                  UR&                  UR(                  S.5        M     U$ )z"Get expenses with optional filters	user_name
user_email)r   r   r   r   r   r   r7   r(   categoryconceptr   )r9   r   r   r   labelr   	outerjoinr   r   r;   r   rK   ascrO   r,   r   r7   r(   r   r   r   )
r6   rA   rB   r   r9   r   expensesgastor   r   s
             r3   get_expensesr     sV    HH\499??;#?AQAQR^A_`ytww,*>*>>? 
 \..);<\..'9:\11W<=nn\..224loo6I6I6KLPPRGH(/$*((**JJ}}"$#22!..}}[[
 	 )0 Or5   r(   r   r   c           
          [        UUUUUUUS9nU R                  U5        U R                  5         U R                  U5        UR                  $ )z&Create a new expense and return its ID)r   r(   r   r   r   r   r7   )r   ro   rp   rq   r   )	r6   r   r(   r   r   r   r   r7   r   s	            r3   create_expenser     sO     !%G FF7OIIKJJw::r5   
expense_idc                     U R                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d  gU R                  U5        U R                  5         g)zDelete an expenseFT)r9   r   r;   r   r<   r{   rp   )r6   r   r   s      r3   delete_expenser     sK    hh|$++LOOz,IJPPRGIIgIIKr5   c           
         U R                  [        R                  5      R                  [	        [        R
                  U:H  U(       a  [        R                  U:H  O[        R                  R                  S5      [        R                  " [        R                  S5      U(       a  UOS:H  5      5      R                  5       nU(       a  US   $ S$ )zJCheck if a reservation already exists for the same date, time, and teacherNr   )r9   r   r   r;   r   r   r   is_r   r   r!   r<   )r6   r   r   r!   r   s        r3   check_duplicate_reservationr     s    xx'..$(,K$+2B2B2F2Ft2LMM+00!4zWXY	
 eg  #8A;,,r5   c                     U R                  [        5      R                  [        R                  U:H  5      R	                  5         U R                  5         g)z1Delete all reservation_student entries for a userN)r9   r   r;   r   r{   rp   r~   s     r3   delete_student_entries_by_userr     s8    HH ''(:(B(Bg(MNUUWIIKr5   )rD   
   NNNNN)NNNNNr_   )
NNr   NNNNN
confirmadar   )r   )NNN)+sqlalchemy.ormr   r   
sqlalchemyr   r   r   typingr   r	   r
   r   r   models.reservationr   r   r   models.userr   r-   r4   intr>   rQ   rS   r\   rm   rr   boolry   r|   r   r   r   r   r   r   r   r   r   r   r   r    r5   r3   <module>r      s   . & & , ,  N N 7[ 7T#s(^ 7t7g 7s 7x?T 7 ! $ #!22
2 2 c]	2
 2 SM2 }2 c]2 
#s(^2n " $ #!33c]3 3 SM	3
 }3 c]3 
$sCx.3D+ +3 +x} +X\]hXi +:) )# )hsm )WZ )H &*!##
# # 3-	#
 sm# # 3-# C=# C=# C=# c]# # # 	#L7 C d 7 C D G c  # $tCQTH~BV @7 C # UX ae .	 	 	s 	W[ 	g s S X[ `d "*?' *?3 *?QUVYQZ *?_cdgimnqirdr_s *?`^G ^S ^T,EW ^  $!!	##}# c]# c]	#
 
$sCx.#T #!!$(
  sm	
 c] C= c] SM 	8w C D 
-G 
-3 
-hsm 
-YabeYf 
-kstwkx 
-w  r5   