
    &6jj                        S SK Jr  S SKJrJrJrJ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JrJ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  S SKJ r J!r!J"r"J#r#  S SK$J%r%  S SK&J'r'J(r(  S SK)J)r*  \" SS/S9r+\+RY                  S5      \" \%5      \" \
5      4S\S\S\4S jj5       r-\+RY                  S5      \" \%5      \" \
5      4S\S\S\4S jj5       r.\+R_                  S5      \" \%5      \" \
5      4S\0S\S\4S jj5       r1S\S\0S \0S!\24S" jr3\+RY                  S#5      \" \%5      \" \
5      4S\0S \0S$\S\S\4
S% jj5       r4\+R_                  S&5      \" \%5      \" \
5      4S\0S\S\4S' jj5       r5\+R_                  S(5      \" S)S*S+9\" \%5      \" \
5      4S\0S,\0S \0S-\\0   S\S\4S. jj5       r6\+R_                  S/5      \" S)S*S+9\" \%5      \" \
5      4S\0S,\0S \0S-\\0   S\S\4S0 jj5       r7\+RY                  S(5      \" \%5      \" \
5      4S\0S,\0S \0S$\8S\S\4S1 jj5       r9\+Ru                  S25      \" S)S*S+9\" \%5      \" \
5      4S\0S,\0S3\0S \0S-\\0   S\S\4S4 jj5       r;\+Ru                  S55      \+Ru                  S65      \" \%5      \" \
5      4S\0S\S\4S7 jj5       5       r:\+Ry                  S85      \" \%5      \" \
5      4S\0S\S\S\4S9 jj5       r=g)):    )Optional)	APIRouterDependsQuerystatus)JSONResponse)get_db)or_)Session)AddRolToSchoolFromExistingCustomerListStoreCustomerUpdateCustomer	UserLogin)CustomerClass)	UserClass)SchoolClass)RolClass)TeachingClass)RolModelSchoolModel	UserModelUsersRolModel)get_current_active_user)resolve_period_year_for_sessionusers_rol_period_clause)datetimez
/customers	Customers)prefixtags/customer_listsession_userdbc                    U R                   c  SOU R                   n[        U5      R                  UU R                  U R                  U R
                  U R                  S9n[        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  SS5      S S.S	9$ U R                   c  S
OSn[        [        R                  SUUS.S	9$ )Nr   )pageitems_per_pageidentification_numbernamescompany_namer   error  messageErrorr   r-   datastatus_codecontentz.Complete customers list retrieved successfullyz Customers retrieved successfully   )r&   r   get_allper_pager(   r)   r*   
isinstancedictgetr   r   HTTP_404_NOT_FOUNDHTTP_200_OK)r"   r#   r$   
page_valueresultr-   s         NC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\routes\customers.pyindexr?      s    #((0m6H6HJ2&&$--+AA!!"// ' F &$FJJx$8G$C11!::i9
 	
 CPBTBTB\>  cEG&&
     z/storecustomerc           
         U R                  5       nUR                  S5      nUR                  S5      nUR                  S5      nUR                  SS 5      n[        U5      R	                  U5      n[        U[         5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  SS	5      S S
.S9$ [        U[         5      (       Ga  UR                  S5      S:X  Ga  UR                  S5      n	U	S UUR                  S5      UR                  SS5       SUR                  SS5       3R                  5       UUUR                  S5      S S.	n
[        U5      R	                  U
5      nUS:X  a  [        [        R                  SSUS
.S9$ U(       Ga  [        U[        5      (       a  [        U5      n[        U5      n[        U5      nU H  nU(       d  M  UR                  5       (       d  M#  U	UR                  5       S S S S.nUR	                  U5      n[        U[         5      (       d  Ma  UR                  S5      S:X  d  Mx  UR                  S5      nUR                  U	U5        SSS.SSS.SSS./nU H   nUUS    US!   S".nUR	                  U5        M"     M     [        [        R                   S#S$US
.S9$ )%Nemailpasswordrol_idschoolsr   r+     r-   zError creating customerr/   r1   successcustomer_idr(   r)     	lastnamesphone)	rI   	school_idrE   rut	full_namerC   rD   rM   branch_office_idr   z(Customer created but error creating userrI   school_nameschool_addressdirector_namecommunity_school_passwordrN   u   Pre Básica   )teaching_nameteaching_type_idu   Básica   Media   rY   rX   )rN   rY   rX      zwCustomer, user, schools and institution roles (Administrador, Evaluador, Coordinador, Profesional) created successfully)r8   r9   popr   storer7   r   r   HTTP_500_INTERNAL_SERVER_ERRORstripr   listr   r   r   #ensure_institution_roles_for_schoolHTTP_201_CREATED)rA   r#   r$   customer_inputsrC   rD   rE   rF   r=   rI   user_inputsuser_resultschool_class	rol_classteaching_classrS   school_inputsschool_resultrN   teachings_to_createteaching_datateaching_inputss                         r>   r_   r_   >   s   mmoO (E"":.H  *F !!)T2G 2$$_5F&$FJJx$8G$C==!::i1JK
 	
 &$FJJx$8I$Ejj/ '"&&'>?+//<=Q?R?RS^`b?c>delln $((1 $

  m))+6!"AA!I"  z'400&r?L I*2.N&;;#4#4#6#6'2'2'8'8':*.)-59%M %1$6$6}$EM "-66=;L;LX;VZc;c$1$5$5k$B	!EEkS\] /<QRS.7QO.51M/+ .AM-64ABT4U1>1O/O
 +00A .A/  '> ++ Q
 r@   z
/edit/{id}idc                    [        U5      R                  U 5      n[        U[        5      (       ao  UR                  S5      (       d  UR                  S5      S:X  aD  [	        [
        R                  SUR                  S5      =(       d    UR                  SS5      S S.S9$ [        U5      R                  SU S	9n/ n[        U[        5      (       a8  U Vs/ s H+  ofR                  S
5      (       d  M  UR                  S
5      PM-     nn[        U[        5      (       a  UR                  S5      (       a  XSS   S'   [	        [
        R                  SSUS.S9$ s  snf )Nr+   r   r,   r-   Customer not foundr/   r1   r   )r&   rI   rS   customer_datarF   r4   zCustomer retrieved successfully)r   r9   r7   r8   r   r   r:   r   r5   rb   r;   )rp   r#   r$   r=   schools_resultschools_listschools          r>   editrw      s.   2""2&F&$VZZ%8%8FJJx<PT[<[11!::g.]&**YH\2]
 	
 !_,,!,DNL.$''@NlfR\R\]jRk1

=1l &$FJJ$?$?-9	*&&8
  ms   E0ErI   rN   returnc                     U R                  [        R                  5      R                  [        R                  U:H  [        R                  U:H  [        R
                  S:H  5      R                  5       nUS L$ )Nr   )queryr   rp   filterrI   deleted_status_idfirst)r$   rI   rN   rows       r>   _school_belongs_to_customerr      s^    
 	NNi'##{2))Q.


 
  d?r@   z-/{customer_id}/schools/{school_id}/rols/clonebodyc                 ~   UR                   U :w  a,  UR                  S:w  a  [        [        R                  SSSS.S9$ [        X@U5      (       d  [        [        R                  SSSS.S9$ [        U5      R                  XUR                  5      n[        U[        5      (       a  UR                  S	5      S
:X  aj  SUR                  S5      =(       d    SR                  5       ;   a  [        R                  O[        R                  n[        UUUR                  SS5      SS.S9$ [        [        R                  SSUS.S9$ )zACopia un rol existente del cliente al colegio (permisos iguales).rW     No autorizadoNr/   r1   r,   z'Colegio no encontrado para este clienter   r+   zya tiener-   rJ   r.   r]   zRol agregado al colegio)rI   rE   r   r   HTTP_403_FORBIDDENr   r:   r   clone_rol_to_schoolr7   r8   r9   lowerHTTP_409_CONFLICTHTTP_400_BAD_REQUESTrd   )rI   rN   r   r#   r$   r=   codes          r>   clone_existing_rol_to_schoolr      s5    ;.<3F3F!3K11*
 	
 'r	BB11"/Xbfg
 	
 b\--kdkkRF&$FJJx$8G$C fjj39r@@BB $$,, 	
 !::i9
 	
 +++DfU r@   z/{customer_id}/rolsc                    UR                   U :w  a,  UR                  S:w  a  [        [        R                  SSSS.S9$ [        U5      R                  U 5      n[        U[        5      (       aA  UR                  S5      S:X  a,  [        [        R                  S	UR                  S
S5      SS.S9$ [        [        R                  SSUS.S9$ )zdLista todos los roles (`rols`) activos del cliente. Solo el mismo cliente o superadmin (`rol_id` 1).rW   r   z0No autorizado para ver los roles de este clienteNr/   r1   r   r+   rG   r-   r.   r4   OK)rI   rE   r   r   r   r   list_by_customer_idr7   r8   r9   r`   r;   )rI   r#   r$   r=   s       r>   list_customer_rolsr      s     ;.<3F3F!3K11M
 	
 b\--k:F&$FJJx$8G$C==!::i9
 	
 &&
 r@   z"/{customer_id}/rols/{rol_id}/usersNu   Año período escolar)descriptionrE   period_yearc                 v   UR                   U :w  a,  UR                  S:w  a  [        [        R                  SSSS.S9$ US:w  a  UR                  [        R                  5      R                  [        R                  U:H  [        R                   U :H  [        R                  U:H  [        R                  S:H  5      R                  5       nU(       d  [        [        R                  S	S
SS.S9$ [        XC5      nUR                  [        R                  [        R                  [        R                   5      R#                  [$        [$        R&                  [        R                  :H  5      R                  [$        R                  U:H  [)        [$        R                  S:H  [$        R                  R+                  S5      5      [-        USS9[        R                   U :H  [)        [        R                  S:H  [        R                  R+                  S5      5      5      R/                  [        R                   R1                  5       [        R                  R1                  5       5      R3                  5       nU V	s/ s H&  oR                  U	R                  U	R                   S.PM(     n
n	[        [        R4                  SSU
S.S9$ s  sn	f )uW   Lista usuarios activos asignados al rol (vía users_rols), validando escuela y cliente.rW   r   z/No autorizado para ver usuarios de este clienteNr/   r1   rZ   r   r,   -Rol no encontrado para este cliente y escuelarW   bypass_global_rol_idsrp   rO   rP   r4   r   )rI   rE   r   r   r   rz   r   rp   r{   rN   r|   r}   r:   r   r   rO   rP   joinr   user_idr
   is_r   order_byascallr;   )rI   rE   rN   r   r#   r$   
rol_existspyrowsruserss              r>   list_users_for_customer_rolr   "  s+    ;.<3F3F!3K11L
 	
 {HHX[[!Vv%$$3""i/**a/	 UW 	 "55!N   
)	CB 	y}}i.A.AB	!!Y\\1

 
  F*//14//33D9 $BdC!![0++q0++//5

 
)%%))+Y\\-=-=-?	@	) 	. LPP4aDDQ[[A4EP&&4?  Qs   +-J6z,/{customer_id}/rols/{rol_id}/users/availablec           	      T   UR                   U :w  a,  UR                  S:w  a  [        [        R                  SSSS.S9$ US:w  a  UR                  [        R                  5      R                  [        R                  U:H  [        R                   U :H  [        R                  U:H  [        R                  S:H  5      R                  5       nU(       d  [        [        R                  S	S
SS.S9$ [        XC5      nUR                  [        R                  5      R                  [        R                  U:H  [!        [        R                  S:H  [        R                  R#                  S5      5      [%        USS95      R'                  5       nU V	s/ s H  oR                  c  M  U	R                  PM     n
n	UR                  [(        R                  [(        R*                  [(        R,                  5      R                  [(        R                   U :H  [!        [(        R                  S:H  [(        R                  R#                  S5      5      5      nU
(       a/  UR                  [(        R                  R/                  U
5      ) 5      nUR1                  [(        R,                  R3                  5       [(        R                  R3                  5       5      R'                  5       nU V	s/ s H&  oR                  U	R*                  U	R,                  S.PM(     nn	[        [        R4                  SSUS.S9$ s  sn	f s  sn	f )uD   Usuarios activos del cliente que aún NO están asignados a ese rol.rW   r   r   Nr/   r1   rZ   r   r,   r   r   r   r   r4   r   )rI   rE   r   r   r   rz   r   rp   r{   rN   r|   r}   r:   r   r   r   r
   r   r   r   r   rO   rP   in_r   r   r;   )rI   rE   rN   r   r#   r$   r   r   assigned_user_rowsr   assigned_user_idsqr   r   s                 r>   %list_available_users_for_customer_rolr   l  sn    ;.<3F3F!3K11"M
 	

 {HHX[[!Vv%$$3""i/**a/	 UW 	 "55#&3blpq 
 
)	CB 	&&'	  F*//14m6U6U6Y6YZ^6_`#BdC


 
  -?X,>q)),>X
y}}i.A.ABII,I''1,i.I.I.M.Md.ST	A HHill&&'899:::i))--/1A1A1CDHHJDKOP4aDDQ[[A4EPF$6$63[_in@opp Y Qs   L L -L%c           
         UR                   U :w  a,  UR                  S:w  a  [        [        R                  SSSS.S9$ UR                  S5      nUc  [        [        R                  SS	SS.S9$ [        XCR                  S
5      5      nUS:w  a  UR                  [        R                  5      R                  [        R                  U:H  [        R                   U :H  [        R                  U:H  [        R                  S:H  5      R                  5       nU(       d  [        [        R                  SSSS.S9$ UR                  [         R                  5      R                  [         R                  [#        U5      :H  [         R                   U :H  [%        [         R                  S:H  [         R                  R'                  S5      5      5      R                  5       n	U	(       d  [        [        R                  SSSS.S9$ UR                  [(        R                  5      R                  [(        R*                  [#        U5      :H  [(        R                  U:H  [%        [(        R                  S:H  [(        R                  R'                  S5      5      [-        USS95      R                  5       n
U
(       a  [        [        R.                  SSSS.S9$ UR                  [(        5      R                  [(        R*                  [#        U5      :H  [(        R                  U:H  [(        R                  S:H  [-        USS95      R1                  [(        R                  R3                  5       5      R                  5       n[4        R6                  " 5       nU(       a  SUl        Xl        X{l        O([)        [#        U5      USUUUS9nUR=                  U5        UR?                  5         [        [        R@                  SS[#        U5      US.S.S9$ )uP   Asigna usuario a rol (users_rols), reactivando relación si existe soft-deleted.rW   r   r   Nr/   r1   r   i  zuser_id es requeridor   rZ   r   r,   r   'Usuario no encontrado para este clienter   r   i  u'   El usuario ya está asignado a este rol)r   rE   r|   r   
added_dateupdated_dater]   zUsuario asignado al rolr   rE   )!rI   rE   r   r   r   r9   r   r   rz   r   rp   r{   rN   r|   r}   r:   r   intr
   r   r   r   r   r   r   descdtnowr   r   addcommitrd   )rI   rE   rN   r   r#   r$   r   r   r   user_exists
active_relsoft_deleted_relr   rels                 r>   add_user_to_customer_rolr     si    ;.<3F3F!3K11"M
 	

 hhy!G33"/EtT
 	

 
)xx7N	OB{HHX[[!Vv%$$3""i/**a/	 UW 	 "55#&3blpq  		LLCL(!![0	++q0)2M2M2Q2QRV2WX


 
  11"/Xbfg
 	
 	!!"	!!S\1  F*//14m6U6U6Y6YZ^6_`#BdC	

 
  00"/Xbfg
 	
 		!!S\1  F*++q0#BdC	

 
-""'')	*	  &&(C-.*(+%')$L
 	sIIKF$;$;PS`y  PS  T[  P\  hn  Do  Fp  q  qr@   z,/{customer_id}/rols/{rol_id}/users/{user_id}r   c           
         UR                   U :w  a,  UR                  S:w  a  [        [        R                  SSSS.S9$ US:w  a  UR                  [        R                  5      R                  [        R                  U:H  [        R                   U :H  [        R                  U:H  [        R                  S:H  5      R                  5       nU(       d  [        [        R                  S	S
SS.S9$ UR                  [        R                  5      R                  [        R                  U:H  [        R                   U :H  [        [        R                  S:H  [        R                  R                  S5      5      5      R                  5       nU(       d  [        [        R                  S	SSS.S9$ [!        XT5      n	UR                  ["        5      R                  ["        R$                  U:H  ["        R                  U:H  [        ["        R                  S:H  ["        R                  R                  S5      5      ['        U	SS95      R)                  5       n
U
(       d  [        [        R                  S	SSS.S9$ [*        R,                  " 5       nU
 H  nSUl
        Xl        M     UR1                  5         [        [        R2                  SSX!S.S.S9$ )zZDesasigna (soft delete) usuario de rol en users_rols, validando cliente y escuela del rol.rW   r   z5No autorizado para modificar usuarios de este clienteNr/   r1   rZ   r   r,   r   r   r   r   u&   El usuario no está asignado a ese rolr4   zUsuario desasignado del rolr   )rI   rE   r   r   r   rz   r   rp   r{   rN   r|   r}   r:   r   r
   r   r   r   r   r   r   r   r   r   r   r;   )rI   rE   r   rN   r   r#   r$   r   r   r   rel_rowsr   r   s                r>   remove_user_from_customer_rolr     sd    ;.<3F3F!3K11R
 	
 {HHX[[!Vv%$$3""i/**a/	 UW 	 "55!N   		LLG#!![0	++q0)2M2M2Q2QRV2WX


 
  11D 	 
)	CB 		!!W,  F*//14m6U6U6Y6YZ^6_`#BdC	

 
  11C
 	
 &&(C !  IIK&&+H^eRxy r@   z/{id}z/delete/{id}c                    [        U5      R                  U 5      n[        U[        5      (       aA  UR	                  S5      S:X  a,  [        [        R                  SUR	                  SS5      S S.S9$ [        [        R                  SS	US.S9$ )
Nr   r+   r,   r-   rr   r/   r1   r4   zCustomer deleted successfully)	r   deleter7   r8   r9   r   r   r:   r;   )rp   r#   r$   r=   s       r>   r   r   n  s     2%%b)F&$FJJx$8G$C11!::i1EF
 	
 &&6
 r@   z/update/{id}c                 ,   UR                  SS9nUR                  SS 5      n[        U5      R                  X5      n[	        U[         5      (       aA  UR                  S5      S:X  a,  [        [        R                  SUR                  SS5      S S	.S
9$ [        U5      nUGb9  [	        U[        5      (       Ga#  [        U5      nU V	s/ s H@  oc  M  [        U	5      R                  5       (       d  M'  [        U	5      R                  5       PMB     n
n	U
 Vs1 s H)  o=(       d    SR                  5       R                  5       iM+     nnUR                  [         5      R#                  [         R$                  U :H  [         R&                  S:H  5      R)                  5       nU H\  nUR*                  =(       d    SR                  5       R                  5       nX;  d  M;  SUl        [,        R.                  " 5       Ul        M^     UR3                  5         UR                  [         5      R#                  [         R$                  U :H  [         R&                  S:H  5      R)                  5       nU V	s0 s H4  oR*                  =(       d    SR                  5       R                  5       U	_M6     nn	[5        5       nU
 GH&  nUR                  5       nUU;   a  M  UR7                  U5        UR                  U5      nUb'  UR9                  U [;        UR<                  5      5        Mh  U US S S S.nUR?                  U5      n[	        U[         5      (       d  M  UR                  S5      S:X  d  M  UR                  S5      nUc  M  UR9                  U [;        U5      5        UR                  [         5      R#                  [         R<                  U:H  5      RA                  5       UU'   GM)     OURC                  U 5        [        [        RD                  SSUS	.S
9$ s  sn	f s  snf s  sn	f )NT)exclude_unsetrF   r   r+   rG   r-   zError updating customerr/   r1   rJ   r   rW   rR   rH   rN   r4   z)Customer and schools updated successfully)#r8   r^   r   updater7   r9   r   r   r`   r   rb   r   strra   r   rz   r   r{   rI   r|   r   rS   r   r   r   r   setr   rc   r   rp   r_   r}   1ensure_institution_roles_for_all_customer_schoolsr;   )rp   rA   r#   r$   re   rF   r=   ri   rh   snames_cleannrequested_lowerexisting_activerv   keyactive_afterby_lower
seen_lowerrS   nkexisting_rowrk   rl   sids                            r>   r   r     sS   mm$m7O !!)T2G2%%b:F&$FJJx$8G$C==!::i1JK
 	
 Iz'488"2/6[w!~CPQFLLN~s1v||~w[>IJkG??,224kJ HH[!VK++r1;3P3PTU3UVSU 	
 &F%%+224::<C)+,(&(ffh#	 &
 			 HH[!VK++r1;3P3PTU3UVSU 	
 GSSl]](b//17791<lSU
&K""$BZNN2#<<+L'==b#looBVW!*"&!%-1M )..}=M-..=3D3DX3NR[3[#''4?AA"c#hO#%88K#8#?#?RU@U#V#\#\#^HRL+ '. 	CCBG&&B
 _ \J& Ts   PP0P0P%;P)>typingr   fastapir   r   r   r   fastapi.responsesr   app.backend.db.databaser	   
sqlalchemyr
   sqlalchemy.ormr   app.backend.schemasr   r   r   r   r   "app.backend.classes.customer_classr   app.backend.classes.user_classr    app.backend.classes.school_classr   app.backend.classes.rol_classr   "app.backend.classes.teaching_classr   app.backend.db.modelsr   r   r   r   app.backend.auth.auth_userr   "app.backend.utils.users_rol_periodr   r   r   r   	customerspostr?   r_   r9   r   rw   boolr   r   r   r   r   r8   r   r   r   putr    r@   r>   <module>r      s    5 5 * *  "  = 4 8 2 < Q Q > g #
	
 AHI`Aaqxy  rA  Y gn  > =DE\=]mtu{m| aM a acj a aF |,34K,L\cdj\k S 	 RY  D
G 
# 
# 
RV 
 ?@
 &&=>&/((( %( 	(
 	( A(V $% &&=>&/    	  & F 34
 "'t9P!Q%&=>&/FFF F #	F
 F 	F 5FR =>
 "'t9P!Q%&=>&/6q6q6q 6q #	6q
 6q 	6q ?6qr 45 &&=>&/dqdqdq dq 	dq
 dq 	dq 6dqN @A "'t9P!Q%&=>&/\\\ \ 	\
 #\ \ 	\ B\~ '
.!.56M.N^efl^m s ) T[  " , ~HOPgHhx  AG  yH Ls Ln LI Lnu L Lr@   