o
    iAk                     @   s  d dl mZmZmZmZmZ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mZmZ d dlZd dlmZmZmZ d dlmZ e  eeZedd	Zed
dZeddZeddZeddZ eddZ!de de  de de de de!"dd dej#d< dej#d< edd ej#d< ed!d"$ d#v ej#d!< ed$d%ej#d&< dej#d'< d(ej#d)< d*ej#d+< ee e%e e
 Z&e&%e d,e&_'d-e&_(e&j)d.d/ Z*d0d1 Z+e,ded2d3 Z-e,d4ed5d6 Z.e,d7d8d9 Z/e,d:d;d< Z0e,d=d>d? Z1e,d@dAdB Z2ej,dCdDgdEedFdG Z3ej,dCdHgdEedIdJ Z4ej,dKdLgdEedMdN Z5ej,dOdPgdEedQdR Z6ej,dOdSgdEedTdU Z7ej,dVdDgdEedWdX Z8ej,dVdHgdEedYdZ Z9ej,d[dDdHgdEd\d, Z:ej,d]dHgdEed^d_ Z;e,d`edadb Z<e,dcddde Z=ej,dfdHgdEedgdh Z>ej?didj Z@eAdkdldm ZBeAdndodp ZCeAdqdrds ZDedtkrEeEdu eEdv eEdu eEdw e+  eEdx ejFG D ]ZHeEdyeIeHjJ deH  qeEdz eEd{ eEd| eEd} eEd~ eEd eEd eEd eEd eEd eEd eEd ejKddd(d(d dS dS )    )Flaskrequestjsonifyrender_templateredirecturl_for)CORS)LoginManagerlogin_required
login_userlogout_usercurrent_user)dbClienteUsuarioN)datetime	timedeltadate)load_dotenv	DB_SERVER	localhostDB_PORT1433DB_DATABASEGestionClientesDB_USERNAMEsaDB_PASSWORDzSistemas123*/	DB_DRIVERzODBC Driver 17 for SQL Serverzmssql+pyodbc://:@/z?driver= +z'&TrustServerCertificate=yes&Encrypt=yesSQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONS
SECRET_KEYz8K8m2#D9v$L4x@R7n*W5q&F1s!P6j%T3y^B8e@N7k$H4m*V9r&L2x#Q5wDEBUGFalse)true1yes   daysREMEMBER_COOKIE_DURATIONSESSION_COOKIE_SECURETSESSION_COOKIE_HTTPONLYLaxSESSION_COOKIE_SAMESITEloginu5   Por favor inicia sesión para acceder a esta página.c                 C   s   t jt| S )N)r   querygetint)user_id r9   '/var/www/html/ActivarClientesMIG/app.py	load_user4   s   r;   c                  C   s  zt   t  td tjjdd } | s?tdddddd}|	d	 tj
| tj
  td
 td td ntd tj }|dkrddlm}m} tddd| |dd ddtddd| |dd ddtddd| |dd ddg}|D ]}tj
| qtj
  td ntd | d! W d"   W dS W d"   W dS 1 sw   Y  W dS  ty } ztd#|  W Y d"}~d$S d"}~ww )%u'   Crear todas las tablas automáticamenteu+   ✓ Tablas creadas/verificadas exitosamenteadminUsernamezAdministrador del Sistemazadmin@empresa.comAdminTr>   NombreCompletoEmailRolActivoadmin123u    ✓ Usuario administrador creadoz  Username: adminz  Password: admin123u#   ✓ Usuario administrador ya exister   )r   r   z
12345678-9zEmpresa Test S.A.S.zTest Company<   r-   Sistema)NITRazonSocialNombreComercialFechaVencimientoCertificadoUsuarioModificacionz
98765432-1zServicios Web LTDAWebServ   z
11111111-1u   Corporación ABCzABC Corp
   u   ✓ Clientes de ejemplo creadosu   ✓ Ya existen z clientes en la base de datosNu   ✗ Error creando tablas: F)appapp_contextr   
create_allprintr   r5   	filter_byfirstset_passwordsessionaddcommitr   countr   r   r   today	Exception)r<   
admin_userclientes_countr   r   clientes_ejemploclienteer9   r9   r:   crear_tablas9   s|   






FFFrb   c                   C   s   t dtdS )u"   Página principal - requiere loginz
index.html)usuario)r   r   r9   r9   r9   r:   home      rd   z
/dashboardc                   C   s   t tdS )zRedirige al home (index.html)rd   )r   r   r9   r9   r9   r:   	dashboard   re   rf   z/testc                   C   s   t dddS )Nokz"Servidor funcionando correctamentestatusmessage)r   r9   r9   r9   r:   test   s   rk   z/test-dbc               
   C   s   z+t   tj } tj }tdd| |dW  d    W S 1 s$w   Y  W d S  tyH } ztdt|ddfW  Y d }~S d }~ww )Nrg   zBase de datos conectada)ri   rj   clientesusuarioserrorrh     )	rP   rQ   r   r5   rZ   r   r   r\   str)r^   usuarios_countra   r9   r9   r:   test_db   s(   


(	rr   z/init-dbc               
   C   sj   zt  } | rtdddW S tddddfW S  ty4 } ztdt|ddfW  Y d}~S d}~ww )	z&Ruta para inicializar la base de datosTz(Base de datos inicializada correctamentesuccessrj   Fz%Error al inicializar la base de datosro   rt   rn   N)rb   r   r\   rp   )	resultadora   r9   r9   r:   init_database   s,   
rw   z/debugc                  C   s:   g } t j D ]}| |jt|jt|d qt| S )N)endpointmethodsrule)	rP   url_map
iter_rulesappendrx   listry   rp   r   )routesrz   r9   r9   r:   debug   s   
r   z/api/clientesGET)ry   c               
   C   s(  zot d tjd} tjd}tjd}t d|  d| d|  tj}| r6|tjd|  d}|rE|tj	d| d}|rT|tj
d| d}| }t d	t|  d
d |D }td|dW S  ty } zt d|  tdt|ddfW  Y d }~S d }~ww )NzEJECUTANDO get_clientes()nitrazon_socialnombre_comercialu   Parámetros: nit=z, razon=z	, nombre=%zClientes encontrados: c                 S      g | ]}|  qS r9   to_dict).0r`   r9   r9   r:   
<listcomp>       z get_clientes.<locals>.<listcomp>T)rt   rl   zERROR en get_clientes: Fru   ro   )rS   r   argsr6   r   r5   filterrH   likerI   rJ   alllenr   r\   rp   )r   r   r   r5   rl   resultra   r9   r9   r:   get_clientes   s<   
r   POSTc                  C   sh  z t  } | dr| dr| dstddddfW S t| d  }t| d  }tjtj	|ktj
|k }|rPtdd| d	| ddfW S d
}d| v ro| d }t|trb|}nt|tro|  dv }d}| drz?t| d  }|r| dvrd|v rt|d }n d|v rt|d }ntt|}tdddt|d  }W n   Y t|t| d  |||tjt| ddt| ddt| ddd	}	tj|	 tj  td| d|  td
d|	 d d!fW S  ty3 }
 z%td"|
  d#dl}|  tj   tdt|
dd$fW  Y d}
~
S d}
~
ww )%u2   Crear cliente - Permite múltiples locales por NITrH   rI   rJ   Fz3NIT, RazonSocial y NombreComercial son obligatoriosru     
Ya existe 	 con NIT TEstadoActivor)   r*   activoactivesir+   NrK   nonenull -%Y-%m-%dr!   %d/%m/%Yk     r,   r-   Observacionesr   	TokenUserTokenPassword)	rH   rI   rJ   r   rK   rL   r   r   r   u   ✓ Creado: z - zCliente creado exitosamentert   rj   r`      ERROR: r   ro   )!r   get_jsonr6   r   rp   stripr   r5   r   rH   rJ   rU   
isinstanceboollowerr   strptimer   r7   floatr   r   r>   r   rW   rX   rY   rS   r   r\   	traceback	print_excrollback)data
nit_limpior   existeestado_activovalfecha_vencimiento	fecha_strdiasr`   ra   r   r9   r9   r:   create_cliente   s   




"r   z%/api/clientes/<int:cliente_id>/estadoPATCHc              
   C   s   zVt d|  d tj| }|stddddfW S t }|d|j |_tj	|_
t |_|dr;|d |_tj  t d	|j d
|j  tdd| dW S  ty } zt d|  tj  tdt|ddfW  Y d }~S d }~ww )NzEJECUTANDO cambiar_estado()FCliente no encontradoru     r   r   zEstado cambiado: z -> TzEstado cambiador   zERROR en cambiar_estado: ro   )rS   r   r5   r6   r   r   r   r   r   r>   rL   r   utcnowFechaModificacionr   r   rW   rY   rH   r   r\   r   rp   )
cliente_idr`   r   ra   r9   r9   r:   cambiar_estadoK  sD   





r   z/api/clientes/<int:cliente_id>PUTc              
   C   s  z1t j| }|stddddfW S t }d|vs d|vr*tddddfW S t|d  }||jkr^t j	t j
| kt j|jkt j|k }|r^tdd	| d
|j ddfW S t|d  |_||_d|v r|d }t|tr{||_nt|tr|  dv |_d|v r|d rt|d nd|_d|v r|d rt|d nd|_d|v r|d rt|d nd|_d|v r|d }|rzFt| }|r
| dvr
d|v rt|d |_n&d|v rt|d |_ntt|}tdddt|d  |_nd|_W n   d|_Y nd|_tj|_t |_ t!j"#  tdd|$ dW S  t%yd }	 z%t&d|	  d dl'}
|
(  t!j")  tdt|	dd!fW  Y d}	~	S d}	~	ww )"zActualizar clienteFr   ru   r   rI   rJ   zCampos obligatorios faltantesr   r   r   r   r   r   r   r   r   rK   r   r   r   r!   r   r   r   r,   r-   NTzCliente actualizador   r   r   ro   )*r   r5   r6   r   r   r   rp   r   rJ   r   	ClienteIDrH   rU   rI   r   r   r   r   r   r   r   r   r   r   rK   r7   r   r   r   r>   rL   r   r   r   rW   rY   r   r\   rS   r   r   r   )r   r`   r   nuevo_nombrer   r   	fecha_valr   r   ra   r   r9   r9   r:   update_clientet  s   








"r   DELETEc              
   C   s   zFt d|  d tj| }|stddddfW S |j|j|jd}tj	
| tj	  t d|d	   td
d|d	  d|dW S  tyo } zt d|  tj	  tdt|ddfW  Y d}~S d}~ww )zEliminar clientezEJECUTANDO delete_cliente(r   Fr   ru   r   )rH   rI   rJ   zCliente eliminado: rH   TzCliente z eliminado exitosamente)rt   rj   cliente_eliminadozERROR en delete_cliente: ro   N)rS   r   r5   r6   r   rH   rI   rJ   r   rW   deleterY   r\   r   rp   )r   r`   cliente_infora   r9   r9   r:   delete_cliente  sB   


r   z/api/usuariosc               
   C   sd   zt j } dd | D }td|dW S  ty1 } ztdt|ddfW  Y d }~S d }~ww )Nc                 S   r   r9   r   )r   rc   r9   r9   r:   r     r   z get_usuarios.<locals>.<listcomp>T)rt   rm   Fru   ro   )r   r5   r   r   r\   rp   )rm   r   ra   r9   r9   r:   get_usuarios  s    

r   c               
   C   s(  zqt  } | dr| dr| dstddddfW S tjj| d d }|r:tdd	| d  ddfW S t| d | d | d
d| dd| ddd}|| d  t	j
| t	j
  tdd| ddfW S  ty } zt	j
  tdt|ddfW  Y d }~S d }~ww )Nr>   PasswordrA   Fz4Username, Password y NombreCompleto son obligatoriosru   r   r=   z"Ya existe un usuario con Username rB   r   rC   r   rD   Tr@   zUsuario creado exitosamente)rt   rj   rc   r   ro   )r   r   r6   r   r   r5   rT   rU   rV   r   rW   rX   rY   r   r\   r   rp   )r   r   rc   ra   r9   r9   r:   create_usuario  sX   




r   z/loginc               
   C   s  t jrtjdkrttdS tddddS tjdkrzt } | s,tdd	d
dfW S | dd	 }| dd}| dd}t
d|  |rK|sUtddd
dfW S tjj|d }|r||r|jsrtddd
dfW S t||d t |_tj  t
d|  tdd| ddW S t
d|  tddd
dfW S  ty } zt
d|  tddd
dfW  Y d }~S d }~ww tdS )Nr   rd   Tu   Ya está autenticador!   )rt   rj   r   r   FzNo se recibieron datosru   r   usernamer   password
rememberMezIntento de login: u&   Usuario y contraseña son obligatoriosr=   z,Usuario inactivo. Contacta al administrador.  )rememberzLogin exitoso para: zLogin exitoso)rt   rj   rc   r   zLogin fallido para: u!   Usuario o contraseña incorrectoszError en login: Error interno del servidorro   z
login.html)r   is_authenticatedr   methodr   r   r   r   r6   r   rS   r   r5   rT   rU   check_passwordrD   r   r   r   UltimoAccesor   rW   rY   r   r\   r   )r   r   r   remember_merc   ra   r9   r9   r:   r4   2  s   




z/logoutc                   C   s$   t dtj  t  tdddS )NzLogout para usuario: TzLogout exitosors   )rS   r   r>   r   r   r9   r9   r9   r:   logout|  s   r   z/api/profilec                   C   s   t dt dS )NT)rt   rc   )r   r   r   r9   r9   r9   r:   profile  s   r   z/api/auth/checkc                   C   s(   t jrtddt  dS tdddS )u)   Verificar si el usuario está autenticadoT)rt   authenticatedrc   F)rt   r   )r   r   r   r   r9   r9   r9   r:   
check_auth  s   r   z/api/auth/change-passwordc               
   C   s   zMt  } | d}| d}|r|stddddfW S t|dk r-tddddfW S t|s<tdd	dd
fW S t| tj	
  tdddW S  tyo } ztj	  tdt|ddfW  Y d}~S d}~ww )u&   Cambiar contraseña del usuario actualcurrent_passwordnew_passwordFu+   Contraseña actual y nueva son obligatoriasru   r      u5   La nueva contraseña debe tener al menos 6 caracteresu   Contraseña actual incorrectar   Tu!   Contraseña cambiada exitosamenters   ro   N)r   r   r6   r   r   r   r   rV   r   rW   rY   r\   r   rp   )r   r   r   ra   r9   r9   r:   change_password  sR   






r   c                   C   s
   t tdS )z.Inyectar usuario actual en todos los templates)r   )dictr   r9   r9   r9   r:   inject_user  s   
r   r   c                 C   s>   t dtj  tjdrtddtjddfS tddfS )NzERROR 404: /api/FzRuta no encontrada)rt   rn   pathr   z404.html)rS   r   r   
startswithr   r   rn   r9   r9   r:   	not_found  s   r   r   c                 C   s:   t dtj  tjdrtddddfS ttdS )NzERROR 401: r   FzNo autorizado - login requeridoru   r   r4   )rS   r   r   r   r   r   r   r   r9   r9   r:   unauthorized  s   r   ro   c                 C   sB   t d|   tj  tjdrtddddfS tddfS )NzERROR 500: r   Fr   ru   ro   z500.html)	rS   r   rW   r   r   r   r   r   r   r   r9   r9   r:   internal_error  s   
r   __main__z2==================================================zINICIANDO SERVIDOR...zInicializando base de datos...z
RUTAS REGISTRADAS:z   z3
==================================================zServidor: http://localhost:5000z"Debug: http://localhost:5000/debugz Test: http://localhost:5000/testz&Test DB: http://localhost:5000/test-dbz&Init DB: http://localhost:5000/init-dbz"Login: http://localhost:5000/loginz3==================================================
zCREDENCIALES DE PRUEBA:zUsuario: adminu   Contraseña: admin123z0.0.0.0i  )hostportr   threaded)Lflaskr   r   r   r   r   r   
flask_corsr   flask_loginr	   r
   r   r   r   modelsr   r   r   osr   r   r   dotenvr   __name__rP   getenvr   r   r   r   r   r   replaceconfigr   init_applogin_manager
login_viewlogin_messageuser_loaderr;   rb   routerd   rf   rk   rr   rw   r   r   r   r   r   r   r   r   r4   r   r   r   r   context_processorr   errorhandlerr   r   r   rS   r{   r|   rz   r~   ry   runr9   r9   r9   r:   <module>   s     







M



(Q'P)/
I
+



	


