
    Sig                        d dl mZ d dlmZmZmZ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mZmZ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!m"Z"m#Z# d dl$m%Z% d dl&m'Z'm(Z( d dl)m)Z*  eddg      Z+e+jY                  d       ee%       ee
      fdededefd       Z-e+jY                  d       ee%       ee
      fdededefd       Z.e+j_                  d       ee%       ee
      fde0dedefd       Z1dede0d e0d!e2fd"Z3e+jY                  d#       ee%       ee
      fde0d e0d$ededef
d%       Z4e+j_                  d&       ee%       ee
      fde0dedefd'       Z5e+j_                  d(       ed)d*+       ee%       ee
      fde0d,e0d e0d-ee0   dedefd.       Z6e+j_                  d/       ed)d*+       ee%       ee
      fde0d,e0d e0d-ee0   dedefd0       Z7e+jY                  d(       ee%       ee
      fde0d,e0d e0d$e8dedefd1       Z9e+ju                  d2       ed)d*+       ee%       ee
      fde0d,e0d3e0d e0d-ee0   dedefd4       Z;e+ju                  d5      e+ju                  d6       ee%       ee
      fde0dedefd7              Z:e+jy                  d8       ee%       ee
      fde0dededefd9       Z=y)):    )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                    | j                   dn| j                   }t        |      j                  || j                  | j                  | j
                  | j                        }t        |t              rC|j                  d      dk(  r/t        t        j                  d|j                  dd      d d	      S | j                   d
nd}t        t        j                  d||d	      S )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         E/var/www/pie360backend.cl/public_html/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           
      H   | j                         }|j                  d      }|j                  d      }|j                  d      }|j                  dd       }t        |      j	                  |      }t        |t               rC|j                  d      dk(  r/t        t        j                  d|j                  dd	      d d
      S t        |t               r|j                  d      dk(  r|j                  d      }	|	d ||j                  d      |j                  dd       d|j                  dd       j                         |||j                  d      d d	}
t        |      j	                  |
      }|dk(  rt        t        j                  dd|d
      S |rt        |t              rt        |      }t        |      }t        |      }|D ]  }|s|j                         s|	|j                         d d d d}|j	                  |      }t        |t               sO|j                  d      dk(  sd|j                  d      }|j                  |	|       dddddddddg}|D ]  }||d    |d!   d"}|j	                  |       !  t        t        j                   d#d$|d
      S )%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&r?L I*2.N& B;#4#4#6'2'2'8'8':*.)-59%M %1$6$6}$EM "-6=;L;LX;VZc;c$1$5$5k$B	!EEkS\] /<QRS.7QO.51M/+ .A BM-64ABT4U1>1O/O
 +00AB/B> ++ Q
 r@   z
/edit/{id}idc                 z   t        |      j                  |       }t        |t              rg|j                  d      s|j                  d      dk(  rBt	        t
        j                  d|j                  d      xs |j                  dd      d d      S t        |      j                  d| 	      }g }t        |t              r0|D cg c]%  }|j                  d
      s|j                  d
      ' }}t        |t              r|j                  d      r||d   d<   t	        t
        j                  dd|d      S c c}w )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%8FJJx<PT[<[11!::g.]&**YH\2]
 	
 !_,,!,DNL.$'@NlfRXR\R\]jRk

=1ll &$FJJ$?-9	*&&8
  ms   D8D8rI   rN   returnc                     | j                  t        j                        j                  t        j                  |k(  t        j                  |k(  t        j
                  dk(        j                         }|d uS )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                 r   |j                   | k7  r.|j                  dk7  rt        t        j                  dddd      S t        || |      st        t        j                  dddd      S t        |      j                  | ||j                        }t        |t              rz|j                  d	      d
k(  rfd|j                  d      xs dj                         v rt        j                  nt        j                  }t        |||j                  dd      dd      S t        t        j                  dd|d      S )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      s3    ;.<3F3F!3K11*
 	
 'r;	B11"/Xbfg
 	
 b\--k9dkkRF&$FJJx$8G$C fjj39r@@BB $$,, 	
 !::i9
 	
 +++DfU r@   z/{customer_id}/rolsc                    |j                   | k7  r.|j                  dk7  rt        t        j                  dddd      S t        |      j                  |       }t        |t              rC|j                  d      dk(  r/t        t        j                  d	|j                  d
d      dd      S t        t        j                  dd|d      S )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                 |   |j                   | k7  r.|j                  dk7  rt        t        j                  dddd      S |dk7  r|j                  t        j                        j                  t        j                  |k(  t        j                   | k(  t        j                  |k(  t        j                  dk(        j                         }|st        t        j                  d	d
dd      S t        ||      }|j                  t        j                  t        j                  t        j                         j#                  t$        t$        j&                  t        j                  k(        j                  t$        j                  |k(  t)        t$        j                  dk(  t$        j                  j+                  d            t-        |d      t        j                   | k(  t)        t        j                  dk(  t        j                  j+                  d                  j/                  t        j                   j1                         t        j                  j1                               j3                         }|D 	cg c]&  }	|	j                  |	j                  |	j                   d( }
}	t        t        j4                  dd|
d      S c c}	w )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PaADDQ[[APEP&&4?  Qs   -+J9z,/{customer_id}/rols/{rol_id}/users/availablec           	      H   |j                   | k7  r.|j                  dk7  rt        t        j                  dddd      S |dk7  r|j                  t        j                        j                  t        j                  |k(  t        j                   | k(  t        j                  |k(  t        j                  dk(        j                         }|st        t        j                  d	d
dd      S t        ||      }|j                  t        j                        j                  t        j                  |k(  t!        t        j                  dk(  t        j                  j#                  d            t%        |d            j'                         }|D 	cg c]  }	|	j                  |	j                   }
}	|j                  t(        j                  t(        j*                  t(        j,                        j                  t(        j                   | k(  t!        t(        j                  dk(  t(        j                  j#                  d                  }|
r/|j                  t(        j                  j/                  |
             }|j1                  t(        j,                  j3                         t(        j                  j3                               j'                         }|D 	cg c]&  }	|	j                  |	j*                  |	j,                  d( }}	t        t        j4                  dd|d      S c c}	w c c}	w )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  sq    ;.<3F3F!3K11"M
 	

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


 
  -?Xq!))BWX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PaADDQ[[APEPF$6$63[_in@opp Y Qs   	LL+Lc           
         |j                   | k7  r.|j                  dk7  rt        t        j                  dddd      S |j                  d      }|t        t        j                  dd	dd      S t        ||j                  d
            }|dk7  r|j                  t        j                        j                  t        j                  |k(  t        j                   | k(  t        j                  |k(  t        j                  dk(        j                         }|st        t        j                  dddd      S |j                  t         j                        j                  t         j                  t#        |      k(  t         j                   | k(  t%        t         j                  dk(  t         j                  j'                  d                  j                         }	|	st        t        j                  dddd      S |j                  t(        j                        j                  t(        j*                  t#        |      k(  t(        j                  |k(  t%        t(        j                  dk(  t(        j                  j'                  d            t-        |d            j                         }
|
rt        t        j.                  dddd      S |j                  t(              j                  t(        j*                  t#        |      k(  t(        j                  |k(  t(        j                  dk(  t-        |d            j1                  t(        j                  j3                               j                         }t5        j6                         }|rd|_        ||_        ||_        n+t)        t#        |      |d|||      }|j=                  |       |j?                          t        t        j@                  ddt#        |      |dd      S )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     sq    ;.<3F3F!3K11"M
 	

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

 
)txx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           
         |j                   | k7  r.|j                  dk7  rt        t        j                  dddd      S |dk7  r|j                  t        j                        j                  t        j                  |k(  t        j                   | k(  t        j                  |k(  t        j                  dk(        j                         }|st        t        j                  d	d
dd      S |j                  t        j                        j                  t        j                  |k(  t        j                   | k(  t        t        j                  dk(  t        j                  j                  d                  j                         }|st        t        j                  d	ddd      S t!        ||      }	|j                  t"              j                  t"        j$                  |k(  t"        j                  |k(  t        t"        j                  dk(  t"        j                  j                  d            t'        |	d            j)                         }
|
st        t        j                  d	ddd      S t+        j,                         }|
D ]  }d|_
        ||_         |j1                          t        t        j2                  dd||dd      S )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     sp    ;.<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^eqwRxy r@   z/{id}z/delete/{id}c                    t        |      j                  |       }t        |t              rC|j	                  d      dk(  r/t        t        j                  d|j	                  dd      d d      S t        t        j                  dd	|d      S )
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                    |j                  d      }|j                  dd       }t        |      j                  | |      }t	        |t               rC|j                  d      dk(  r/t        t        j                  d|j                  dd      d d	
      S t        |      }|t	        |t              rt        |      }|D 	cg c]8  }	|	t        |	      j                         s t        |	      j                         : }
}	|
D ch c]$  }|xs dj                         j                         & }}|j                  t               j#                  t         j$                  | k(  t         j&                  dk(        j)                         }|D ]S  }|j*                  xs dj                         j                         }||vs4d|_        t-        j.                         |_        U |j3                          |j                  t               j#                  t         j$                  | k(  t         j&                  dk(        j)                         }|D 	ci c]/  }	|	j*                  xs dj                         j                         |	1 }}	t5               }|
D ]  }|j                         }||v r|j7                  |       |j                  |      }|&|j9                  | t;        |j<                               c| |d d d d}|j?                  |      }t	        |t               s|j                  d      dk(  s|j                  d      }||j9                  | t;        |             |j                  t               j#                  t         j<                  |k(        jA                         ||<    n|jC                  |        t        t        jD                  dd|d	
      S c c}	w c c}w c c}	w )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     s[   mm$m7O !!)T2G2%%b/:F&$FJJx$8G$C==!::i1JK
 	
 Iz'48"2/6[!!-CPQFLLNs1v||~[[>IJAG??,224JJ HH[!VK++r1;3P3PTU3UVSU 	
 & 	/F%%+224::<C/)+,(&(ffh#		/
 			 HH[!VK++r1;3P3PTU3UVSU 	
 GSSQ]](b//17791<S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   O	O#O)O4O)>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@   