
    NuiW                        S SK JrJrJrJrJr  S SKJrJr  S SK	J
r
  S SKJrJrJrJr  S SKJr  S SKrS SKrS SKrS SKrSSKJr  SS	KJr  SS
KJr  SSKJr  SSKJrJrJ r   SSK!J"r"J#r#J$r$  \" 5       r%\%RM                  S\S9S\4S j5       r'\%RM                  S5      \" \5      4S\S\(S\
4S jj5       r)\%RM                  S5      \" \5      4S\S\(S\
4S jj5       r*\%RM                  S\+S9\" SSSS9\" SSSSS 9\" S5      \" S5      \" S5      \" \5      4S\S!\(S"\(S#\\(   S$\\(   S%\\,   S\
4S& jj5       r-\%R]                  S\+S9\" \5      4S\S'\"S\
4S( jj5       r/\%Ra                  S\+S9\" \5      4S\S\(S'\#S\
4S) jj5       r1\%Re                  S\+S9\" \5      4S\S\(S\
4S* jj5       r3\%R]                  S+\+S9\" \5      4S\S\
4S, jj5       r4\%RM                  S-\\+   S9SSS\" \5      4S\S.\\,   S/\\,   S#\\(   S\
4
S0 jj5       r5\%R]                  S-\+S9\" \5      4S\S'\$S\
4S1 jj5       r6\%Re                  S2\+S9\" \5      4S\S3\(S\
4S4 jj5       r7g)5    )	APIRouterRequestDependsHTTPExceptionQuery)HTMLResponseRedirectResponse)Session)ListOptionalAnyDict)datetimeN   )	templates)get_db)reservation_crud)	auth_crud)current_userrequire_docente_or_adminrequire_admin   )ReservationInReservationUpdate	ExpenseInz	/reservas)response_classrequestc                 t   #    [        U 5      nU(       d
  [        SSS9$ [        R                  " SXS.5      $ 7f)Nz/logini/  )urlstatus_codezreservas.htmlr   user)r   r	   r   TemplateResponser!   s     >/home/mario/Escritorio/thel4footbal/app/reservations/routes.pyreservas_dashboardr%      s5      DH#>>%%o77YZZs   68z/api/reservations/{res_id}res_iddbc                    #    [        U 5        [        R                  " X!5      nU(       d
  [        SSS9e[        R                  " U5      $ 7f)N  Reserva no encontradar    detail)r   res_crudget_reservation_by_idr   reservation_to_dict)r   r&   r'   rs       r$   api_reservation_getr1   !   s?     W%&&r2A4KLL''**s   A	Az#/api/reservations/{res_id}/studentsc                 L   #    [        U 5        [        R                  " X!5      $ 7fN)r   r-   get_reservation_students)r   r&   r'   s      r$   api_reservation_studentsr5   *   s     W%,,R88s   "$z/api/reservations)response_modelu   Página (1-based))gedescription
   d   u   Tamaño de página)r7   ler8   pagesizeuser_id
docente_idstatusc           	         #    [        U 5        [        R                  " UUUUUUS9nUS   US   S   US   S   US   S   US   S   S.$ 7f)	N)r<   r=   r>   r?   r@   itemsmetatotalr<   r=   pages)rB   rD   r<   r=   rE   )r   r-   get_reservations_paginated)r   r<   r=   r>   r?   r@   r'   results           r$   reservations_paginatedrH   1   st      W%00
F (vv&vv&( s   AA
payloadc                   #    [        U 5      n U R                  5       I S h  vN n[        SUR	                  5        3[
        R                  S9  UR                  nUR                  n [        R                  R                  U5         [        [        UR                  S5      5      u  pxSUs=::  a  S	:  a  O  OSUs=::  a  S
:  d  O  [        SSS9eUS:X  a  US:X  a
  [        SSS9eUS SUS 3n[        UR                  5      n	U	S::  d  U	S:  a
  [        SSS9eUR                   n
UR"                  nUR$                  nUR&                  nUR(                  =(       d    SR+                  5       nUR,                  nUR.                  nU(       d  UR0                  (       a  UR0                  /nUR2                  nUc  UR4                  nUc   [        UR7                  S5      5      nUb   [        U5      nUS:  al  [8        R:                  " UU5      nU(       a'  [=        UR>                  5      R+                  5       S:w  a&  [        SU S3[
        R                  S9  [        SSS9eOS n UcR   [C        U[        5      (       a  [        US   5      nO[E        USS 5      nUc   [        US   5      nUb  [        U5      nU(       a  [K        U5      S:X  a  US   OS n0 n UR7                  S5      =(       d    0 n[C        U[        5      (       aI  URM                  5        H5  u  nn [        U5      n[        U=(       d    S5      n[O        SU5      UU'   M7     URP                  =(       d    0 nU(       d_   UR7                  S5      n[C        U[        5      (       a8  URM                  5        VVs0 s H  u  nn[        U5      [S        U5      _M     nnn0 nU(       a  U(       a;  U H4  n[O        S[        UR7                  UU
5      =(       d    S5      5      UU'   M6     O*U H$  n[O        S[        U
=(       d    S5      5      UU'   M&     [U        URW                  5       5      nO[        U
=(       d    S5      n[X        RZ                  " X%UU5      n U (       a
  [        SSS9e[X        R\                  " UUUU	UUUUUR^                  UUU=(       d    SU(       a  SOSS9n!U(       a  U H  nUR7                  UU5      n"[X        R`                  " UU!UU"(       a  SOSS9  U"(       d  M>  UR7                  US5      n#[c        U#S -  S!5      n$[8        R:                  " UU5      n%U%(       a(  U%Rd                  (       a  U%Rd                  Rf                  n&OS"n&[c        U&U$-
  S!5      n'[8        Rh                  " UUU'S#9  U#S:  d  M  S$U S%U 3n([X        Rj                  " UUU#S&U(UU!S'9  M     S(U!S).$  GN! [         a    0 n GNf = f! [         a    [        SSS9ef = f! [         a    [        SSS9ef = f! [         a     GNOf = f! [@         a'    [        SU S3[
        R                  S9  [        SSS9ef = f! [F        [H        [@        4 a    S n GNf = f! [         a&  n[        SU 3[
        R                  S9   S nAGNS nAff = f!    GM  = f!    GNu= fs  snnf !    GN= f7f)*Nz&DEBUG: Creating reservation. Payload: )file  u!   Fecha inválida (usa YYYY-MM-DD).r+   :u   Hora inválida (usa HH:MM).r      <      Hora inválida.,No se admiten reservas a medianoche (00:00).02d     Duración inválida.
confirmada
teacher_iddocentezDEBUG: teacher_id z is not a valid docente./   docente_id no corresponde a un docente válido.z invalid format.   docente_id inválido.idz)DEBUG: Failed to set default docente_id: r   per_student_centsstudent_paymentsz4El docente ya tiene una reserva en esa fecha y hora.)datetimeduration_minutesprice_centsnameemailphonenotesr>   r@   r?   paid)re         Y@r           matricula_eurReserva  reservar]   amount_centscategoryconceptr>   reservation_idTokrZ   )6r   json	Exceptionprintdictsysstderrr]   r^   dtfromisoformatr   mapintsplitr_   r`   ra   rb   rc   r@   lowerre   user_idsr>   r?   rV   getr   get_user_by_idstrrole
ValueError
isinstancegetattrKeyError	TypeErrorlenrB   maxr\   boolsumvaluesr-   check_duplicate_reservationcreate_reservationrd   add_student_to_reservationroundfinanceri   update_user_financecreate_expense))r   rI   r'   merawdate_txttime_txthhmmdminr`   ra   rb   rc   status_norm	paid_flagstudent_idsr?   docente_userelegacy_user_idr[   psckvkkvvr\   spsharessidtotal_price_centsdupcreated_reservation_idis_paidshare	share_eurucurrent_balnew_balconcept_bases)                                            r$   api_reservations_creater   O   sy    	!'	*BLLN" 
27<<>2B
C#**U ||H||HY
h'SS(..-. LbLQ"\r\4EFF	Qw274bccS2c(#Hw''(DqyD5L4JKK%%K<<DMMEMME>>1\88:KI""K7??' ##J''
	cggl34Z 	QZJA~(77JG#s<+<+<'='C'C'E'R/
|;ST[^[e[ef )SArss	 (S "

 	2t$$!"T(m &b$5&*%(D]
 & _

 (3s;7G17L[^RVN gg)*0bc4  		1!QBc!&qk,/2J%b) $ //52
'',-R2t$$AC$LASVT!W_!$L F"!!S):)>)>sK)P)UTU%VWs # #!!S)9%:;s #0 !12	 
.
.rXz
RC
4jkk%88
%mm?Q" C&**3	:G//4JC[bVWhij w

3*!%%-3	 ,,R5"#))"9"9K"%Ki 7;--b#WM 19%-hZq
#CL++%%*!* , #'=/ B 455q #   Y4WXXY  S4QRRS>  		   	Q&zl2BC#**UC8OPP	Q  &y*= *%)
*
  	>qcBT	  !D %M	sc  [W% W"W% A[)W8 	!X *D![X( &[*A<X9 &['X9 )[.4Z #Y- 1Z ?[A[ %.Z>[ [49[ -"[[ E[!B[7+["W% %W51[4W55[8X[X%%[(
X62[5X66[91Y**[-ZZ ZZ 
Z;Z60[6Z;;[>[ [ [	[[ [[c                 J  #    [        U 5        [        R                  " X15      nU(       d
  [        SSS9e U R	                  5       I S h  vN n[        US5      (       a  UR                  SS9O
U=(       d    0 nSU;   a*  US   b$   [        R                  R                  US   S5        SU;   a  US   b   [        US   5      R                  5       S S n[        [        UR                  S5      5      u  pUS SU	S 3US'   SUs=::  a  S:  a  O  OSU	s=::  a  S:  d  O  [        S	SS9eUS:X  a  U	S:X  a
  [        S	SS9eSU;   a-  SU;  a'   [        UR!                  S5      =(       d    S5      US'   SU;   a*  US   b$  [        US   5      n
U
S::  d  U
S:  a
  [        S	SS9eSU;   ak  US   be  [        US   5      R                  5       R#                  5       S;  a
  [        S	SS9e[        US   5      R                  5       R#                  5       US'   SU;   a  SU;  a  UR!                  S5      US'   SU;   ai  US   bc   [        US   5      nUS:  aN  [$        R&                  " X;5      nU(       a'  [        UR(                  5      R#                  5       S:w  a
  [        S	SS9eSU;   a  US   b	  US   S!:X  a  US	 S"U;   aG  S#U;  aA   [        [/        [1        [        US"   5      R3                  S$S%5      5      S&-  5      5      US#'   OLS'U;   aF  S#U;  a@   [        [/        [1        [        US'   5      R3                  S$S%5      5      S&-  5      5      US#'   S#U;   a.   [        US#   =(       d    S5      US#'   US#   S:  a
  [        S	S(S9e[5        UR6                  5      nUnS)U;   a#  US)   b  [5        US)   5      nU(       a  S*OSUS)'   OUR!                  S)UR!                  S+5      5      nUby  [9        U[4        5      (       a  UnOS[9        U[        [        45      (       a8  [        U5      R                  5       R#                  5       nUS,;   a  SnOUS-;   a  S.nU(       a  S*OSUS)'   [        R:                  " X140 UD6  UR!                  S/5      nUc  S0U;   a  UR!                  S05      nUbH  [9        U[<        5      (       a3   U Vs/ s H  n[        U5      PM     nn[        R>                  " X1U5        UR!                  S#UR@                  5      nU(       + =(       a    Un0 n UR!                  S15      =(       d    0 n[9        U[        5      (       aI  URC                  5        H5  u  nn [        U5      n[        U=(       d    S5      n[E        SU5      UU'   M7     0 n URF                  =(       d    UR!                  S25      =(       d    0 n[9        U[        5      (       a8  URC                  5        VVs0 s H  u  nn[        U5      [5        U5      _M     nnn[        RH                  " X15      n/ nU Hy  n U S3   n![5        U R!                  S)S.5      5      n"UR!                  U!S.5      n#U(       a  Sn#U#(       d  MG  U"(       a  MP  URK                  U!5        [        RL                  " X1U!S*5        M{     U(       Ga*  [        R                  RO                  5       RQ                  S45      n$UR!                  SURR                  5      n%UR!                  SURT                  5      =(       d    S5n&S6U% S7U& 3n'U H  n!UR!                  U!U5      n([/        U(S8-  S95      n)[$        R&                  " UU!5      RV                  n*U*(       a  U*RX                  OS:n+[/        U+U)-
  S95      n,[$        RZ                  " UU!U,S;9  U(S:  d  M  [        R\                  " UU%U(S<U'U![^        =(       d    US=9  M     SUS>.$  GN! [
         a    0 n GNf = f! [
         a    [        S	S
S9ef = f! [
         a    [        S	SS9ef = f!    GN= f! [*        [,        4 a    [        S	S S9ef = f!    GN= f!    GN	= f!   SUS#'    GN= fs  snf ! [*         a     GNf = f!    GM)  = f!    GN= fs  snnf !    GN= f7f)?Nr)   r*   r+   rw   T)exclude_unsetr]   %Y-%m-%drL   u(   Fecha inválida. Usa formato YYYY-MM-DD.r^      rM   rR   u"   Hora inválida. Usa formato HH:MM.r   rN   rO   rP   rQ   durationr_   rS   rT   r@   >   	cancelada	pendiente
completadarU   zEstado no permitidorV   r?   rW   rX   rY    	price_eurr`   ,.r:   priceu   Precio inválido.re   r   has_paid)1trueu   sísion)0falsenooffFr   r   r[   r\   rZ   z%Y-%m-%dT%H:%M:%Sz00:00rj   rk   rf   r   rg   rh   rl   rm   rr   )0r   r-   r.   r   rt   ru   hasattrrw   rz   r   strptimer   stripr|   r}   r~   r   r   r   r   r   r   r   r   floatreplacer   re   r   update_reservationlistsync_reservation_studentsr`   rB   r   r\   r4   appendupdate_student_payment_statusnowstrftimer]   r^   r   ri   r   r   r   )-r   r&   rI   r'   reservationr   updatestr   r   r   r?   rW   	prev_paidnew_paidvalsr   uid	valid_idseffective_price_centsdo_charge_globalr[   r   r   r   r   r   r\   r   current_studentsstudents_to_chargestudentr   is_paid_alreadyshould_be_paidnow_txtr   r   r   r   r   fr   r   s-                                                r$   api_reservations_updater     sV    W% 00<K4KLLLLN" 3:'62J2Jglll.QXQ^\^G WV_8	dKK  *= WV_8	^GFO$**,Ra0Aaggcl+FB!#C"S2GFO R"b2 S9JKK7rQw S9ghhS/w>	+.swwz/B/Ga+HW'( W$1C)D)P7-./19u S9OPP7wx0<wx !'')//19oo S;NPP 1288:@@B s|7: # 5w7<#8#D	RW\23JA~#222B#gll"3"9"9";y"H'C@qrr wGL$9$AW\EZ^`E`L! cm7:	&)%c#k:J6K6S6STWY\6]0^ad0d*e&fW]#	CM8	&)%c#g,6G6O6OPSUX6Y0Z]`0`*a&bW]# 	+&)'-*@*EA&FW]#=!A% S9LMM [%%&IHWV_8('!Qggfcggj12?#t$$C#s,,X^^%++-99d8665#+aGFO 6g6 wwz"HMS077=)
8T : :	-56XcSXI6..r9E
 $KK{7N7NO%38gg)*0bc4  		1!QBc!&qk,/2J%b) $ %%J1C)DJb$<>HHJGJDAqAQJG  88D#dmw{{659:)--c59!N>//%%c*222sAF $ ;;??$--.ABKK(8(89KK(8(89DW"8*AhZ8&S&**30EFUuu}a0Y ))"c2::Q./1??S[[94a8W**2s'J	((""'') $:$Df '* f%%S #   	dC8bcc	d  	^C8\]]	^ 	. I& 	R S9PQQ	R 	 	
 	+&> 7 		 !D  HDs  3b#_( 	_%
_( 7b##_; )b#6A` Ab#&`+ 4Cb#A"`3 $$b#	?a b#?a b#a! 6E
b#a3 a.a3 3.b#"Ab (.bb b#Ab 2"bb Ab#8b#D0b#50b#%_( (_84b#7_88b#;`b#`((b#+`0-b#3ab#ab#ab#!a+(b#.a3 3
b=b# bb#b
b bb#b b b#c                 6  #    [        U 5        [        R                  " X!5      nU(       d
  [        SSS9e[        R                  " X!5      nU H  nUR
                  (       d  M  [        R                  " X%R
                  5      nU(       d  M?  UR                  (       d  MR  UR                  R                  n[        UR                  S-  S5      n[        Xx-   S5      n	[        R                  " X%R
                  U	S9  M     [        R                  " X!5        SS0$ 7f)	Nr)   r*   r+   rf   r   rh   rs   T)r   r-   r.   r   get_expenses_by_reservationr>   r   r   r   ri   r   rn   r   delete_reservation)
r   r&   r'   r   expensesexpenser"   r   
amount_eurr   s
             r$   api_reservations_deleter     s     W% 00<K5LM	M 33B?H ???,,RAT#||99#G$8$85$@!D !!91=..r??RYZ " +$<s   AD#%DDA:Dz/api/users/quickc           
        #    [        U 5         U R                  5       I Sh  vN nUR	                  S5      =(       d    SR                  5       nUR	                  S5      =(       d    SR                  5       nUR	                  S5      =(       d    SR                  5       R                  5       nU(       a  [        U5      S	:  a
  [        SS
S9eU(       a  [        U5      S	:  a
  [        SSS9eU(       a  SU;  a
  [        SSS9e[        R                  " X5      nU(       a
  [        SSS9eSR                  S [        S5       5       5      nU SU 3n[        R                  " UUUUSUUS9n	UR                  [        R                  5      R                  [        R                  R                   U	:H  5      R#                  5       n
U
(       a  SU
l        UR'                  5         SU	UUUUS.S.$  GN! [         a    [        SSS9ef = f7f)zFCreate a simplified alumno user on-the-fly from the reservation modal.NrL   u   JSON inválido.r+   
first_namer   	last_namerb   r   u0   El nombre es obligatorio (mínimo 2 caracteres).u6   Los apellidos son obligatorios (mínimo 2 caracteres).@u+   El email es obligatorio y debe ser válido.i  z#Ya existe un usuario con ese email.c              3      #    U  H:  n[         R                  " [        R                  [        R                  -   5      v   M<     g 7fr3   )secretschoicestringascii_lettersdigits).0_s     r$   	<genexpr>)api_users_quick_create.<locals>.<genexpr>  s.     f\eWXgnnV-A-AFMM-QRR\es   AA   rk   alumno)ra   rb   passwordr   r   r   r   T)rZ   r   r   rb   ra   )rs   r"   )r   rt   ru   r   r   r   r   r   r   get_user_by_emailjoinrangecreate_userqueryUserfilterrZ   firstis_temporarycommit)r   r'   datar   r   rb   existingrandom_passwordra   r>   user_objs              r$   api_users_quick_creater    s     W%G\\^# ((<(.B557J+&,"335IXXg$"++-335EZ1,4fggI*4lmmCu$4abb **25H4YZZ ggf\abd\effO\9+&D##
 G xx	'..y~~/@/@G/KLRRTH !
		 $"
	 	S $ G4EFFGs,   HG0 G-G0 GH-G0 0HHz/api/expenses	date_fromdate_toc                 R   #    [        U 5        [        R                  " XAX#5      nU$ 7fr3   )r   r-   get_expenses)r   r  r  r>   r'   r   s         r$   api_expenses_listr  $  s&      '$$RGEHOs   %'c                   #    [        U 5         [        R                  R                  UR                  S5        [        R                  " UUR                  R                  5       [        UR                  =(       d    S5      UR                  =(       d    SR                  5       =(       d    S UR                  =(       d    SR                  5       =(       d    S UR                  =(       d    SR                  5       =(       d    S UR                  b  [        UR                  5      OS UR                   (       a  [        UR                   5      OS S9nSUS	.$ ! [
         a    [        SSS9ef = f7f)
Nr   rL   u   Fecha inválida (YYYY-MM-DD).r+   r   r   )r'   r]   rn   ro   rp   rd   r>   rq   Trr   )r   rz   r   r   r]   ru   r   r-   r   r   r}   rn   ro   rp   rd   r>   rq   )r   rI   r'   gids       r$   api_expenses_creater  0  s    'U
W\\:6 
!
!\\!--23""(b//19T&B--/74}}"))+3t(/(CGOO$6=6L6Ls7112RV	C c""  U4STTUs   E+*E DE+E((E+z/api/expenses/{gid}r  c                 T   #    [        U 5        [        R                  " X!5        SS0$ 7f)Nrs   T)r   r-   delete_expense)r   r  r'   s      r$   api_expenses_deleter  D  s%     'B$$<s   &()8fastapir   r   r   r   r   fastapi.responsesr   r	   sqlalchemy.ormr
   typingr   r   r   r   r   rz   rx   r   r   databaser   models.baser   modelsr   r-   r   	auth.depsr   r   r   schemasr   r   r   routerr   r%   r}   r1   r5   rw   r   rH   postr   patchr   deleter   r  r  r  r       r$   <module>r,     s   E E < " , ,   
       1  M M @ @	 K5[g [ 6[ ()KRSY? +w + + + *+ 12PWX^P_ 9G 9S 9g 9 39 5 aA+>?bQ34HI"4[ %d!$K&/
  c]	
  SM 	 6:  6ZabhZi {67 {6] {6PW {6 7{6| *4@krsykz r&7 r&C r&J[ r&ah r& Ar&j +DAOVW] 7 C W  BD 5AH 7' 7w 7 67x ODJ7  $!!&/		}	 c]	 c]		
 		 8	 _T2RYZ`Ra #w # # # 3#& $T:HOPV w S g  ;r+  