o
    	fC                     @   s  d dl Z d dlmZmZmZ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mZ d dlmZ d dlmZ d dlZd dlmZ d dlZd d	lmZ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&Z&d dl'Z'd dl(Z(d dl)m*Z* d dl+m,Z, d dl-m.Z. ej/ej0dd e1e2Z3ee2Z4ee4Z5e j67dpde4_8ee4ddgg dddgddid de4j9d< de4j9d < e:e4 e4;d!d"d# Z<d d$l=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ d%e4j9d&< d'e4j9d(< de4j9d)< de4j9d*< d+e4j9d,< d-e4j9d.< d+e4j9d/< ee4ZKe4L > zejMed0 e3Nd1 eO  e3Nd2 W n eyS ZP ze3Qd3eReP  W Y dZP[PndZP[Pww W d   n	1 s_w   Y  e ZSeS:e4 d4eS_TeSjUd5d6 ZVe4;d7ed8d9 ZWe4j;d:d;d<gd=d>d4 ZXe4;d?d@dA ZYe4;dBdCdD ZZe4j[dEdF Z\e4j]dGdH Z^e4;dIedJdK Z_e4;dLedMdN Z`dOdP Zae4j;dQd;d<gd=dRdS Zbe4j;dTd<gd=dUdV Zce4j;dWd<gd=dXdY Zde4;dZd[d\ Zed]d^ Zfe4j;d_d<gd=d`da Zge4j;dbd<gd=dcdd Zhe4j;ded;d<gd=dfdg Zie4j;dhd;d<gd=edidj Zje4;dkedldm Zke4;dnedodp Zle4;dqedrds Zme4;dtedudv Zne4j;dwd;gd=dxdy Zoe4j;dwd<gd=dzd{ Zpe4j;d|d;gd=d}d~ Zqe4j;d|d<gd=dd Zre. Zsest  e4j;dd;gd=dd Zue4j;dd;gd=dd Zve4j;dd<gd=dd Zwdd Zxe4j;dd<gd=dd Zye4j;dd<gd=dd Zze4j;dd<gd=dd Z{e4j;dd<gd=dd Z|e4j;dd;gd=dd Z}e4;dedd Z~e4;dedd Ze4;dedd Ze4j;dd;gd=dd Ze4j;dd<gd=dd Ze4j;dd;gd=dd Ze4j;ddgd=dd Ze4j;dd;gd=dd Ze4;dedd Ze4;dedd Ze4;dedd Ze4j;dd<gd=dd Ze4j;dd;gd=dd Ze4j;dd;gd=dd Ze4j;ddgd=ddĄ Ze4j;ddgd=ddƄ Ze4;dǡeddɄ Ze4;dʡedd̄ Ze4j;dd<gd=ddτ Ze4j;dd;gd=ddф Ze4j;dd;gd=ddԄ Ze4j;ddgd=ddք Ze4j;ddgd=dd؄ Ze4j;dd;d<gd=eddۄ Ze4;dܡeddބ Ze4j;dd<gd=dd Ze4j;dd;d<gd=edd Ze4;ddd Ze4ddd Ze4edd Ze2dkr_e5je4dd dS dS )    N)Flaskjsonifyrequestrender_templatesessionredirecturl_forflash)CORS)Mail)datetime	timedelta)SQLAlchemyError)text)db)SocketIOemit)LoginManager
login_userlogin_requiredlogout_usercurrent_user)wraps)check_password_hash)Message)RotatingFileHandler)
joinedload)BackgroundSchedulerz)%(asctime)s - %(levelname)s - %(message)s)levelformatFLASK_SECRET_KEYz28f42a73d4f8c4c1d9c525f68995ced6b2537a quaracer6492z/api/*zhttp://194.163.45.32)GETPOSTPUTDELETEOPTIONSzContent-TypeAuthorizationT)originsmethodsallow_headerssupports_credentials)	resourcesz;postgresql://postgres:1234@194.163.45.32/inflables_medellinSQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONSz/test-db-connectionc               
   C   sX   zt jtd} t j  W dS  ty+ } zdt| dfW  Y d }~S d }~ww )NSELECT 1)u%   Conexión a la base de datos exitosa.   z&Error al conectar a la base de datos:   )r   r   executer   commitr   str)resulte r6   &/var/www/html/inflable_medellin/app.pytest_db_connection0   s   
r8   )OrdenesCompra1OrdenesCompra2	Entradas1	Entradas2Salidas1Salidas2ReferenciasUnidadesUsuariosConsecutivosGrupoLicenciaClienteszsmtp.gmail.comMAIL_SERVERiK  	MAIL_PORTMAIL_USE_TLSMAIL_USE_SSLinfo@migsistemas.comMAIL_USERNAMEeejgelzxmgrfrkdhMAIL_PASSWORDMAIL_DEFAULT_SENDERr.   u$   Conexión a la base de datos exitosazTablas creadas exitosamentez5Error al conectar a la base de datos o crear tablas: loginc                 C   s   t j| S )N)rA   queryget)user_idr6   r6   r7   	load_userX   s   rS   /c                   C   s   t jr	ttdS ttdS )N	dashboardrO   )r   is_authenticatedr   r   r6   r6   r6   r7   index\   s   rW   z/loginr!   r"   )r(   c               
   C   s  t jrtdt j  ttdS tjdkrtd ztj	} | 
d}| 
d}td|  tjj|d }|rtd	|  td
|j  |j|kr|jrvtd|  t| tj |_tj  tdddW S td|  tddddfW S td|  tddddfW S td|  tddddfW S  ty } z tjdt| dd tddt| ddfW  Y d }~S d }~w ty } z tjdt| dd tddt| ddfW  Y d }~S d }~ww td tdS )NzUsuario ya autenticado: rU   r"   zIntento de loginusernamepasswordzIntento de login para usuario: 	IdUsuariozUsuario encontrado: zEstado activo del usuario: zLogin exitoso para usuario: TzLogin exitososuccessmessagez(Intento de login para usuario inactivo: FzUsuario inactivoi  u%   Contraseña incorrecta para usuario: u!   Usuario o contraseña incorrectoszUsuario no encontrado: z*Error de atributo en el proceso de login: exc_infoz$Error en la estructura del usuario: r0   zError en el proceso de login: zError interno del servidor: u   Renderizando página de loginz
login.html) r   rV   loggerinfor[   r   r   r   methodjsonrQ   debugrA   rP   	filter_byfirst	is_activePasswordr   r   funcnowUltimoAccesor   r2   r   warningAttributeErrorerrorr3   	Exceptionr   )datarX   rY   userr5   r6   r6   r7   rO   c   sL   




((
z#/verificar_usuario/<nombre_usuario>c                 C   s:   t jj| d }|rtd|jddfS tddidfS )NrZ   T)existeemailr/   rs   F  )rA   rP   rf   rg   r   Email)nombre_usuariousuarior6   r6   r7   verificar_usuario   s   ry   z/listar_usuariosc                  C   s    t j } tdd | D dfS )Nc                 S   "   g | ]}|j |j|j|jd qS )r[   Nombrerv   Rolr{   .0ur6   r6   r7   
<listcomp>       
z#listar_usuarios.<locals>.<listcomp>r/   )rA   rP   allr   )usuariosr6   r6   r7   listar_usuarios   s   
r   c                   C   s"   t dtj t dt  d S )NzHeaders: %szBody: %s)ra   re   r   headersget_datar6   r6   r6   r7   log_request_info   s   r   c                 C   s   t d|   | S )NzResponse: %s)ra   re   r   )responser6   r6   r7   log_response_info   s   r   z/logoutc                   C   s   t   ttdS )NrO   )r   r   r   r6   r6   r6   r7   logout   s   r   z
/dashboardc                   C   s   t dtdS )Nz
index.html)rr   )r   r   r6   r6   r6   r7   rU         rU   c                   C   s   d tjtjtj ddS )N    k)joinrandomchoicesstringascii_uppercasedigitsr6   r6   r6   r7   generar_codigo_verificacion   s   r   z/restContrasenac                  C   s   t jdkrCt j} | d}| d}tjj|d }|r4||_t	j
  td|  tdddS td	|  td
ddS tdS )Nr"   	idUsuario
contrasenarZ   u'   Contraseña restablecida para usuario: Tu%   Contraseña restablecida exitosamenter\   u>   Intento de restablecer contraseña para usuario no existente: Fu*   No se encontró ningún usuario con ese IDzrestContrasena.html)r   rc   rd   rQ   rA   rP   rf   rg   ri   r   r   r2   ra   rb   r   rm   r   )rq   
id_usuarionueva_contrasenarx   r6   r6   r7   restContrasena   s   



r   z/enviarCodigoVerificacionc               
   C   s   t j} | d}tjj|d }|s$td|  t	ddddfS t
 }||_tj  z'tdd	|jgd
}d| |_t| td|j  t	ddddfW S  ty{ } ztdt|  t	ddddfW  Y d }~S d }~ww )Nr   rZ   uC   Intento de enviar código de verificación a usuario no existente: FUsuario no encontrador\   ru   u5   Código de Verificación para Restablecer ContraseñarJ   sender
recipientsu    Tu código de verificación es: u$   Código de verificación enviado a: Tu    Código de verificación enviador/   zError al enviar correo: zError al enviar el correor0   )r   rd   rQ   rA   rP   rf   rg   ra   rm   r   r   codigo_verificacionr   r   r2   r   rv   bodymailsendrb   rp   ro   r3   )rq   r   rx   r   msgr5   r6   r6   r7   enviar_codigo_verificacion   s.   


r   z"/verificarCodigoYCambiarContrasenac                  C   s   t j} | d}| d}| d}tjj|d }|s.td|  t	dddd	fS |j
|krDtd
|  t	ddddfS ||_d |_
tj  td|  t	ddddfS )Nr   r   codigoVerificacionrZ   u8   Intento de verificar código para usuario no existente: Fr   r\   ru   u2   Código de verificación incorrecto para usuario: u#   Código de verificación incorrecto  u0   Contraseña cambiada exitosamente para usuario: Tu!   Contraseña cambiada exitosamenter/   )r   rd   rQ   rA   rP   rf   rg   ra   rm   r   r   ri   r   r   r2   rb   )rq   r   r   r   rx   r6   r6   r7   %verificar_codigo_y_cambiar_contrasena   s    




r   z	/registroc                   C      t dS )NzpideLicencia.htmlr   r6   r6   r6   r7   registro   s   r   c                 C   s6   t jt j }dtj|dd}| d d  d| S )Nr      r      -)r   r   r   r   r   r   )nit
caracterescodigo_aleatorior6   r6   r7   generar_codigo_licencia  s   r   z/solicitar_licenciac                  C   s  t d ztj} | d }| d }| d }| d }| d }| d}t|}|d d   td	d
 }d	tj
tjtj dd}	t|||||	d| d | d d}
ttt ||| d | d | d | d |t| d |||rxt|dnd d}tj|
 tj| tj  t d|  tddd|gd}d| d| d| d| d | d!|pd" d#| d$|	 d%|_t| t d&|  td'd(d)W S  ty } z t  d*t|  tj!  td+t|d)d,fW  Y d }~S d }~ww )-NzIniciando solicitud de licenciar   razonsocialnombrecomercialrt   tipolicenciafechavencimientor   d   i  r   
   r   administradortelefonoubicacioncomercialr[   r|   Apellidorv   ri   r}   Telefono	Direccionciudadversioncantidadusuarioz%Y-%m-%d)idr   r   r   r   r   r   numerolicenciar   r   r   r   z"Nuevo usuario y licencia creados: zNueva Licencia GeneradarJ   zriosjuan3053@gmail.comr   z*
Se ha generado una nueva licencia:

NIT: u   
Razón Social: z
Nombre Comercial: u   
Número de Licencia: z
Tipo de Licencia: z
Fecha de Vencimiento: zN/Au#   

Información de acceso:
Usuario: u   
Contraseña: uR   

Por favor, cambie su contraseña después del primer inicio de sesión.
        zCorreo enviado a: Tz0Licencia generada y correo enviado exitosamente.r\   zError al solicitar licencia: Fr0   )"ra   rb   r   formrQ   r   lowerr   randintr   r   r   ascii_lettersr   rA   rD   r3   uuiduuid4intr   strptimer   r   addr2   r   r   r   r   r   rp   ro   rollback)rq   r   razon_socialnombre_comercialrt   tipo_licenciafecha_vencimientocodigo_licenciarX   rY   nuevo_usuarionueva_licenciar   r5   r6   r6   r7   solicitar_licencia  s   

 





"r   z/verificar_licenciac               
   C   s   z2t j} | d }tjj|d }|r#td|  tdddW S t	d|  tdd	dW S  t
yY } ztd
t|  tdt|ddfW  Y d }~S d }~ww )Nlicencia)r   z#Licencia verificada correctamente: Tz"Licencia verificada correctamente.r\   u)   Intento de verificar licencia inválida: Fu   Licencia inválida.zError al verificar licencia: r0   )r   rd   rD   rP   rf   rg   ra   rb   r   rm   rp   ro   r3   )rq   r   licencia_dbr5   r6   r6   r7   verificar_licenciaT  s   "r   z/registro_completoc               
   C   s   t jdkrxtt jd t jd t jd t jd t jd t jd t jd t jd	 d
} z tj|  tj  t	d| j
  tdd ttdW S  tyw } z"tdt|  tj  tdt| d W Y d }~tdS d }~ww tdS )Nr"   r   nombreapellidort   rY   rolr   	direccionr   zNuevo usuario registrado: u;   Usuario registrado exitosamente. Por favor, inicia sesión.r]   rO   zError al registrar usuario: ro   zregistro_completo.html)r   rc   rA   r   r   r   r   r2   ra   rb   r[   r	   r   r   rp   ro   r3   r   r   r   r5   r6   r6   r7   registro_completof  s2   



r   z/crear_usuarioc                  C   s   t jdkrtdd ttdS tjdkr{ttjd tjd tjd tjd	 tjd
 tjd tjd dktjd tjd d	} zt	j
|  t	j
  tdd ttdW S  tyz } zt	j
  tdt| d W Y d }~tdS d }~ww tdS )Nr   u.   No tienes permiso para acceder a esta página.ro   rU   r"   r   r   r   rt   rY   r   activotruer   r   )	r[   r|   r   rv   ri   r}   Activor   r   zUsuario creado exitosamente.r]   zError al crear usuario: zcrear_usuario.html)r   r}   r	   r   r   r   rc   rA   r   r   r   r   r2   rp   r   r3   r   r   r6   r6   r7   crear_usuario  s6   





r   z/get_user_rolec                   C   s   t dtjiS )Nrole)r   r   r}   r6   r6   r6   r7   get_user_role  s   r   z/ordenes-comprac                   C   r   )Nzordenes_compra.htmlr   r6   r6   r6   r7   ordenes_compra     r   z/gestion-ordenesc                   C   r   )Nzgestionar_ordenes_compra.htmlr   r6   r6   r6   r7   gestion_ordenes  r   r   z/detalle-ordenesc                   C   r   )Nzdetalles_orden_entrega.htmlr   r6   r6   r6   r7   detalle_ordenes  r   r   z	/entradasc               
   C   l   zt j } tdd | D W S  ty5 } ztdt|  tdt|idfW  Y d }~S d }~ww )Nc                 S   P   g | ]$}|j |j|j|j |j|j|j|jr|j nd |j	t
|jd
qS )N)
numeromes	id_bodegafecha_creacionr   recibeid_proyectofecha
id_clientetotal)NumeroMesIdBodegaFechaCreacion	isoformatr[   Recibe
IdProyector   	idclientefloatr   )r   r5   r6   r6   r7   r         
z#listar_entradas.<locals>.<listcomp>zError al listar entradas: ro   r   )r;   rP   r   r   r   ra   ro   r3   )entradasr5   r6   r6   r7   listar_entradas     

 r  c                  C      zLt j} t| d | d | d | d | d | d| d| d| d	| d
| d| d| dd}tj| tj  td|j	ddfW S  t
yw } ztj  tdt|  tdt|idfW  Y d }~S d }~ww )Nr   r   r   r   r   cuenta_debitocuenta_creditoobservacionesr   r   opr   r   )r   r   r   r   r[   CuentaDebitoCuentaCreditoObservacionesr   r   r  r   r   u   Entrada creada con éxitomensajer      zError al crear entrada: ro   r   )r   rd   r;   rQ   r   r   r   r2   r   r   r   r   ra   ro   r3   )rq   nueva_entradar5   r6   r6   r7   crear_entrada  4   

 r  z/salidasc               
   C   r   )Nc                 S   r   )N)
r   r   r   r   r   r   r   r   num_traslador   )r   r   r   r   r   r[   r   
idproyector   numtraslador   r   )r   sr6   r6   r7   r     r   z"listar_salidas.<locals>.<listcomp>zError al listar salidas: ro   r   )r=   rP   r   r   r   ra   ro   r3   )salidasr5   r6   r6   r7   listar_salidas  r  r  c                  C   r  )Nr   r   r   r   r   r  r  r  r   r   r  r   r  )r   r   r   r   r[   r  r	  r
  r   r  r  r   r  u   Salida creada con éxitor  r  zError al crear salida: ro   r   )r   rd   r=   rQ   r   r   r   r2   r   r   r   r   ra   ro   r3   )rq   nueva_salidar5   r6   r6   r7   crear_salida  r  r  z/api/ordenes-compra/<numero>c                 C   s   zXt jtt jtt j| }|stddidfW S t|j|j	
 |j|j|j|jr1|j
 nd |jr:|j
 nd |jdd |jD |jrS|jj|jj|jjdnd d
W S  tyt } ztdt|idfW  Y d }~S d }~ww )	Nro   Orden no encontradaru   c                 S   &   g | ]}|j |jt|j|jd qS )IdReferenciaDescripcionCantidadPedidaObservacionesRefr  r  r   r  r  r   refr6   r6   r7   r   2      
z!obtener_orden.<locals>.<listcomp>	IdClienter|   TipoIdentificacion)
r   r   Estador
  TiempoPreparacionHoraEntregaHoraRecogidar   r?   Clienter0   )r9   rP   optionsr   clientedetallesrQ   r   r   r   r   r'  r
  r(  r)  r*  r   r%  r|   r&  rp   r3   r   ordenr5   r6   r6   r7   obtener_orden"  s8    

 r1  z/api/ordenes-comprac               
   C   sd   zt jtt j } tdd | D W S  ty1 } ztdt|idfW  Y d }~S d }~ww )Nc              
   S   sh   g | ]0}|j |j |j|j|jr|jjnd |jr|jjnd |jr%|jjnd ddd |j	D dqS )Nr$  c                 S   r  r  r   r!  r6   r6   r7   r   O  r#  z5obtener_ordenes_compra.<locals>.<listcomp>.<listcomp>)r   r   r'  r
  r+  r?   )
r   r   r   r'  r
  r-  r%  r|   r&  r.  )r   or6   r6   r7   r   E  s    
z*obtener_ordenes_compra.<locals>.<listcomp>ro   r0   )	r9   rP   r,  r   r-  r   r   rp   r3   )ordenesr5   r6   r6   r7   obtener_ordenes_compraA  s   
 r4  z%/api/ordenes-compra/<numero>/entregarc              
   C   s   zPt j}tj| }|stddddfW S d|_t|d |_	|d |_
|d rDt|d |_|jtd	d
 }tjtd|| gd tj  tdddW S  tyr } ztj  tdt|ddfW  Y d }~S d }~ww )NFr  r]   ro   ru   	EntregadahoraEntregar   horaRecogida   )hoursdate)rj   triggerrun_dateargsTzEntrega confirmadar\   r   )r   rd   r9   rP   rQ   r   r'  r   fromisoformatr)  r   r*  r   	scheduleradd_jobreaparecer_ordenr   r   r2   rp   r   r3   )r   rq   r0  hora_reaparicionr5   r6   r6   r7   entregar_ordenZ  s0   


"rD  c                 C   s^   t  ! tj| }|rd|_tj  W d    d S W d    d S 1 s(w   Y  d S )NzPendiente de Recoger)	appapp_contextr9   rP   rQ   r'  r   r   r2   )r   r0  r6   r6   r7   rB  v  s   
"rB  c               
   C   s6  zxt j} tj| d }|s"t| d | d | d d}tj| n|j| d kr.| d |_t	| d t
| d | d | d d	|jd
}tj| | d D ]}t| d |d |d |d |d d}tj| qNt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   tipo_identificacionnombre_cliente)r%  r&  r|   r   r   r   r  Creada)r   r   r[   r
  r'  r%  referenciasid_referenciadescripcioncantidad)r   r  r  r  r  Tz#Orden de compra creada exitosamenter\   r  Fr5  r   )r   rd   rE   rP   rQ   r   r   r   r|   r9   r   r?  r%  r:   r2   r   rp   r   r3   )rq   r-  nueva_ordenr"  	nueva_refr5   r6   r6   r7   crear_orden_compra~  sJ   


"rP  z%/api/ordenes-compra/<numero>/prepararc              
   C      z"t j| }|stddddfW S d|_tj  tdddW S  tyD } ztj	  tdt
|dd	fW  Y d }~S d }~ww )
NFr  r5  ru   u   En preparaciónTu   Preparación iniciadar\   r   r9   rP   rQ   r   r'  r   r   r2   rp   r   r3   r/  r6   r6   r7   preparar_orden     

"rS  z&/api/ordenes-compra/<numero>/finalizarc              
   C   rQ  )
NFr  r5  ru   ListaTu   Preparación finalizadar\   r   rR  r/  r6   r6   r7   finalizar_orden  rT  rV  z%/api/ordenes-compra/<numero>/cancelarc              
   C   rQ  )
NFr  r5  ru   	CanceladaTzOrden canceladar\   r   rR  r/  r6   r6   r7   cancelar_orden  rT  rX  z/api/notificacionesc                  C   s   ddiddig} t | S )Nr  zNueva orden de compra creadazOrden lista para entrega)r   )notificacionesr6   r6   r7   obtener_notificaciones  s   rZ  z/entradas.htmlc                   C   r   )Nzentradas.htmlr   r6   r6   r6   r7   r     r   r   z/salidas.htmlc                   C   r   )Nzsalidas.htmlr   r6   r6   r6   r7   r    r   r  z/referencias.htmlc                   C   r   )Nzreferencias.htmlr   r6   r6   r6   r7   rJ    r   rJ  z/api/referenciasc               
   C   sh   zt j } tdd | D W S  ty3 } ztdt|  tddidfW  Y d }~S d }~ww )Nc                 S   sp   g | ]4}|j |j|j|j|jr|j nd |j|j|j|j	d ur%t
|j	nd |jd ur0t
|jnd |jdqS )Nr  
ReferenciaIdGrupoIdUnidadr   	Ubicacionr'  TipoCostoPrecioVenta1r
  )r  r\  r]  r^  r   r   r_  r'  r`  ra  r   rb  r
  )r   rr6   r6   r7   r     s    
z&listar_referencias.<locals>.<listcomp>zError al listar referencias: ro   z Error al obtener las referenciasr0   )r?   rP   r   r   r   loggingro   r3   )rJ  r5   r6   r6   r7   listar_referencias  s   

re  c                  C   s  zgt j} td|   t }t| d | d | d | d | dd| dd	| d
d| dd| dd| dd|d}tj	
| tj| d }|rT| d |_tj	  td td	dddfW S  ty } z tj	  tdt|  tdt|ddfW  Y d }~S d }~w ty } ztdt|  tddt| ddfW  Y d }~S d }~w ty } ztj	  tdt|  tddddfW  Y d }~S d }~ww )NzDatos recibidos: r  r\  r]  r^  r_  r   r'  Tr`  Fra  r   rb  r
  )r  r\  r]  r^  r_  r'  r`  ra  rb  r
  r   ultimoCodigozReferencia creada exitosamenter\   r  zError de SQLAlchemy: r5  r0   zError de KeyError: zFalta el campo r   Error inesperado: z'Error inesperado al crear la referencia)r   rd   rd  rb   r   rk   r?   rQ   r   r   r   rC   rP   rf  r2   r   r   r   ro   r3   KeyErrorrp   )rq   r   nueva_referenciagrupor5   r6   r6   r7   crear_referencia  sN   









"(
rk  z/api/referencias/<id>c                 C   s  zFt j| }|r>t|j|j|j|j|jr|j	 nd |j
|j|j|jd ur+t|jnd |jd ur6t|jnd |jdW S tddidfW S  tyj } ztdt|  tddidfW  Y d }~S d }~w ty } ztdt|  tdd	idfW  Y d }~S d }~ww )
Nr[  ro   Referencia no encontradaru   z+Error de SQLAlchemy al obtener referencia: zError al obtener la referenciar0   z(Error inesperado al obtener referencia: z)Error inesperado al obtener la referencia)r?   rP   rQ   r   r  r\  r]  r^  r   r   r_  r'  r`  ra  r   rb  r
  r   rd  ro   r3   rp   r   
referenciar5   r6   r6   r7   obtener_referencia4  s4   
ro  r$   c              
   C   s   z't j| }|rtj| tj  tddddfW S tddddfW S  tyQ } ztj	  t
d	t|  tdd
ddfW  Y d }~S d }~w tyz } ztj	  t
dt|  tddddfW  Y d }~S d }~ww )NTz!Referencia eliminada exitosamenter\   r/   Frl  r5  ru   z,Error de SQLAlchemy al eliminar referencia: zError al eliminar la referenciar0   z)Error inesperado al eliminar referencia: z*Error inesperado al eliminar la referencia)r?   rP   rQ   r   r   deleter2   r   r   r   rd  ro   r3   rp   rm  r6   r6   r7   eliminar_referenciaN  s$   


rq  z/api/grupos-unidadesc               
   C   s   zt j } tj }tdd | D dd |D dW S  ty@ } ztdt|  tddidfW  Y d }~S d }~ww )	Nc                 S      g | ]}|j |j|jd qS )r]  rC   rf  rs  r   gr6   r6   r7   r   g  s    z+obtener_grupos_unidades.<locals>.<listcomp>c                 S   s   g | ]	}|j |jd qS )r^  Unidadrv  r~   r6   r6   r7   r   h  s    )gruposunidadesz$Error al obtener grupos y unidades: ro   z"Error al obtener grupos y unidadesr0   )	rC   rP   r   r@   r   r   ra   ro   r3   )rx  ry  r5   r6   r6   r7   obtener_grupos_unidadesa  s   


rz  z/grupos.htmlc                  C      t j } td| dS )Nzgrupos.htmlrx  )rC   rP   r   r   r|  r6   r6   r7   rx  q     
rx  z/nuevo_grupo.htmlc                   C   r   )Nznuevo_grupo.htmlr   r6   r6   r6   r7   nuevo_grupow  r   r~  z/editar_grupo.html/<int:id>c                 C   s   t d| dS )Nzeditar_grupo.htmlr   r   r  r6   r6   r7   editar_grupo|  r   r  z/api/gruposc               
   C   s   z*t j} t| d | d | d | d d}tj| tj  tdd|jdd	fW S  t	yL } ztj
  td
t|ddfW  Y d }~S d }~ww )Nr]  rC   r'  UltimoCodigor]  rC   r'  rf  TzGrupo creado exitosamenter]   r^   r   r  Fr5  r   )r   rd   rC   r   r   r   r2   r   r]  rp   r   r3   )rq   r~  r5   r6   r6   r7   crear_grupo  s    

"r  c               
   C   X   zt j } tdd | D W S  ty+ } ztdt|idfW  Y d }~S d }~ww )Nc                 S   rz   )r  r  rt  r6   r6   r7   r     r   z"obtener_grupos.<locals>.<listcomp>ro   r   )rC   rP   r   r   rp   r3   )rx  r5   r6   r6   r7   obtener_grupos  s   

 r  z/api/grupos/<id>c              
   C   sx   zt j| }|rt|j|j |j|jdW S tddidfW S  ty; } ztdt|idfW  Y d }~S d }~ww )Nr  ro   Grupo no encontradoru   r   )	rC   rP   rQ   r   r]  r'  rf  rp   r3   r   rj  r5   r6   r6   r7   obtener_grupo  s   
 r  r#   c              
   C   s   z9t j| }|stddidfW S tj}|d|j |_ |d|j|_|d|j|_tj	
  tddd	W S  ty[ } ztj	  td
t|ddfW  Y d }~S d }~ww )Nro   r  ru   rC   r'  rf  TzGrupo actualizado exitosamenter\   Fr5  r   )rC   rP   rQ   r   r   rd   r'  rf  r   r   r2   rp   r   r3   )r   rj  rq   r5   r6   r6   r7   actualizar_grupo  s   

"r  c              
   C      z$t j| }|stddidfW S tj| tj  tdddW S  tyF } ztj	  tdt
|dd	fW  Y d }~S d }~ww )
Nro   r  ru   TzGrupo eliminado exitosamenter\   Fr5  r   )rC   rP   rQ   r   r   r   rp  r2   rp   r   r3   r  r6   r6   r7   eliminar_grupo     

"r  z/unidades.htmlc                  C   r{  )Nzunidades.htmlry  )r@   rP   r   r   r  r6   r6   r7   ry    r}  ry  z/nueva_unidad.htmlc                   C   r   )Nznueva_unidad.htmlr   r6   r6   r6   r7   nueva_unidad  r   r  z/api/unidadesc               
   C   s   z't j} t| d | d | d d}tj| tj  tdd|jddfW S  t	yI } ztj
  td	t|d
dfW  Y d }~S d }~ww )Nr^  rw  r'  r^  rw  r'  TzUnidad creada exitosamenter  r  Fr5  r   )r   rd   r@   r   r   r   r2   r   r^  rp   r   r3   )rq   r  r5   r6   r6   r7   crear_unidad  s   

"r  c               
   C   r  )Nc                 S   rr  )r  r  r~   r6   r6   r7   r     s    
z$obtener_unidades.<locals>.<listcomp>ro   r   )r@   rP   r   r   rp   r3   )ry  r5   r6   r6   r7   obtener_unidades  s   

 r  z/api/unidades/<id>c              
   C   st   zt j| }|rt|j|j|jdW S tddidfW S  ty9 } ztdt|idfW  Y d }~S d }~ww )Nr  ro   Unidad no encontradaru   r   )	r@   rP   rQ   r   r^  rw  r'  rp   r3   r   unidadr5   r6   r6   r7   obtener_unidad   s   
 r  c              
   C   s   z1t j| }|stddidfW S tj}|d|j|_|d|j|_tj	
  tdddW S  tyS } ztj	  td	t|d
dfW  Y d }~S d }~ww )Nro   r  ru   rw  r'  TzUnidad actualizada exitosamenter\   Fr5  r   )r@   rP   rQ   r   r   rd   rw  r'  r   r   r2   rp   r   r3   )r   r  rq   r5   r6   r6   r7   actualizar_unidad  s   

"r  c              
   C   r  )
Nro   r  ru   TzUnidad eliminada exitosamenter\   Fr5  r   )r@   rP   rQ   r   r   r   rp  r2   rp   r   r3   r  r6   r6   r7   eliminar_unidad!  r  r  z/configuracionc                  C   s<   t jdkrt jd} | dkrttdS tdd tdS )Nr"   rY   z	smig123*/configuracion_consecutivosu   Contraseña incorrectaro   zconfiguracion.html)r   rc   r   rQ   r   r   r	   r   )rY   r6   r6   r7   configuracion2  s   

r  z/configuracion_consecutivosc               
   C   s   zt j } | stdd td| dW S  ty= } zt|jd }tj	
d|  td| d W Y d }~n3d }~w tyk } z#tj	
d	t|  tj	
t  td
t| d W Y d }~nd }~ww ttdS )Nz3No se encontraron consecutivos en la base de datos.rb   zconfiguracion_consecutivos.html)consecutivosorigzError de base de datos: z%Error al acceder a la base de datos: ro   rg  u   Ocurrió un error inesperado: r  )rB   rP   r   r	   r   r   r3   __dict__rE  ra   ro   rp   	traceback
format_excr   r   )r  r5   ro   r6   r6   r7   r  =  s"   

 r  z/api/guardar_consecutivoc                  C   s   z6t j} t| d | d | d | d | d | d | d | d| d	 d
	}tj| tj  tdddW S  t	yX } ztj
  tdt|ddfW  Y d }~S d }~ww )NIdConsecutivoConsecutivo
FormularioPrefijoDesdeHastaActual
Resolucionr'  )	r  r  r  r  r  r  r  r  r'  Tz!Consecutivo guardado exitosamenter\   Fr5  r   )r   rd   rB   rQ   r   r   r   r2   r   rp   r   r3   )rq   nuevo_consecutivor5   r6   r6   r7   api_guardar_consecutivoP  s*   

"r  z/editar_consecutivo/<int:id>c              
   C   s0  t j| }tjdkrtjd |_tjd |_tjd |_tjd |_	tjd |_
tjd |_tjd |_tjd	 |_tjd
 |_dtjv |_tjd |_tjd |_tjd |_tjd |_ztj  tdd ttdW S  ty } ztj  tdt| d W Y d }~nd }~ww td|dS )Nr"   r  r  r  r  r  r  r  FechaResolucionObservacionesResolucionr'  ComprobantePredeterminadofechafinresoluciontiporesolucionz$Consecutivo actualizado exitosamenter]   r  z$Error al actualizar el consecutivo: ro   zeditar_consecutivo.html)consecutivo)rB   rP   
get_or_404r   rc   r   r  r  r  r  r  r  r  r  r  r'  r  r  r  r  r   r   r2   r	   r   r   rp   r   r3   r   r   r  r5   r6   r6   r7   editar_consecutivog  s4   



 r  z/eliminar_consecutivo/<int:id>c              
   C   s   t j| }ztj| tj  tdd W n! ty9 } ztj	  tdt
| d W Y d }~nd }~ww ttdS )Nz"Consecutivo eliminado exitosamenter]   z"Error al eliminar el consecutivo: ro   r  )rB   rP   r  r   r   rp  r2   r	   rp   r   r3   r   r   r  r6   r6   r7   eliminar_consecutivo  s   

 r  r0   c                 C   s   t d|  dS )NzServer Error: %s)zError interno del servidorr0   )ra   ro   )ro   r6   r6   r7   internal_error  s   r  c                 C   s"   t jd| dd dt| dfS )NzUnhandled Exception: %sTr_   zError inesperado: {}r0   )ra   ro   r   r3   )r5   r6   r6   r7   unhandled_exception  s   r  __main__)re   )osflaskr   r   r   r   r   r   r   r	   
flask_corsr
   
flask_mailr   r   r   sqlalchemy.excr   
sqlalchemyr   rd  
extensionsr   r  flask_socketior   r   flask_loginr   r   r   r   r   	functoolsr   werkzeug.securityr   r   r   r   r   logging.handlersr   sqlalchemy.ormr   !apscheduler.schedulers.backgroundr   basicConfigDEBUG	getLogger__name__ra   rE  socketioenvironrQ   
secret_keyconfiginit_approuter8   modelsr9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   r   rF  r1   rb   
create_allr5   ro   r3   login_manager
login_viewuser_loaderrS   rW   rO   ry   r   before_requestr   after_requestr   r   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r@  startr1  r4  rD  rB  rP  rS  rV  rX  rZ  r   r  rJ  re  rk  ro  rq  rz  rx  r~  r  r  r  r  r  r  ry  r  r  r  r  r  r  r  r  r  r  r  errorhandlerr  rp   r  runr6   r6   r6   r7   <module>   s   (




<









 


+

	






L









-





+












	




