o
    Pf?                 
   @   s	  d dl mZmZmZmZmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dl Z d dl!Z!d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&m'Z'm(Z(m)Z) d dl*Z*d dl+Z+d dl,m-Z- d d	l.m/Z/ d d
l,m0Z0 d dl1m2Z2 d dl mZ d dl3m4Z4 d dl.m5Z5 d dl6m7Z7 d dl8Z8d dl9m:Z: d dl+Z+dd Z;e"j<e"j=dd e"j<e"j>dd e"?e@ZAee@ZBeeBddddid deBjCd< deBjCd< eeB e"j<e"j=dd deBjCd< d eBjCd!< deBjCd"< deBjCd#< d$eBjCd%< d&eBjCd'< d$eBjCd(< e
eBZDz$eBE  ejFGe/d) W d   n	1 s4w   Y  e"Hd* W n e-y\ ZI ze"Jd+eKeI  W Y dZI[IndZI[Iww eBE  eL  W d   n	1 sqw   Y  eBMd,d-d. ZNeBMd/d0d1 ZOeBjMd2d3gd4d5d6 ZPeBjMd7d3gd4d8d9 ZQeBjMd:d3gd4d;d< ZReBMd=d>d? ZSeBMd@dAdB ZTeBjMdCg dDd4dEdF ZUeBjMdGd3dHgd4dIdJ ZVeBjMdKdLdMgd4dNdO ZWeBjMdGdHgd4dPdQ ZXeBjMdKdMgd4dRdS ZYeBjMdTdHgd4dUdV ZZeBjMdTd3gd4dWdX Z[eBjMdYd3gd4dZd[ Z\eBjMd\d3dHgd4d]d^ Z]eBjMd_dMgd4d`da Z^eBjMdbd3dHgd4dcdd Z_eBjMdedMgd4dfdg Z`dhdi ZaeBMdjdkdl ZbeBjMdmdHgd4dndo ZceBjMdpd3gd4dqdr ZdeBjMdsd3gd4dtdu ZeeBjMdvdHgd4dwdx ZfeBjMdyd3gd4dzd{ ZgeBjMd|dHgd4d}d~ ZheBjMddLgd4dd ZieBjMdbd3gd4dd ZjeBjMdd3gd4dd ZkeBjMddHgd4dd ZleBjMddHgd4dd ZmeBjMdd3dHgd4dd ZneBjMdg dd4dd ZoeBjMdd3gd4dd ZpeBjMd\d3gd4dd ZqeBjMdd3gd4dd ZreBjMddMgd4dd ZseBjMdd3gd4dd Ztdd ZueBMddd ZveBjMdd3dHgd4dd Zwdd Zxdd ZyeBjzdd Z{eBj|dd Z}eBjMddHgd4dd Z~eBjMddHgd4dd ZeBjMddHgd4dd ZeBjMdd3gd4dd ZeBjMdd3gd4dd ZeBjMdd3gd4ddÄ ZeBjMdd3gd4ddƄ ZeBjMdd3gd4ddɄ ZeBjMdd3gd4e dd̄ ZeBjMdd3gd4ddτ ZeBjMdd3gd4dd҄ ZeBjMdd3gd4ddՄ ZeBMd֡dd؄ ZeBd١ddۄ ZeBdܡddބ ZeBjMd7d3dHgd4dd ZeBjMdd3gd4dd ZeBjMdg dDd4dd ZeBjMdd3dMgd4dd ZeBjMdd3gd4dd ZeBjMddHgd4dd ZeBjMdd3gd4dd ZeBjMd/dHdLgd4dd ZeBjMd/d3gd4dd ZeBjMddHgd4dd ZeBjMddHgd4dd ZeBjMddLgd4dd Zdd  ZeBMde dd ZeBjMddHgd4dd ZeBjMd/dHgd4dd ZeBjMd	dHgd4d
d Ze@dkreBjdd dS dS (      )Flaskjsonifyrequestrender_template	send_file)CORScross_origin)MailMessage)dbinit_dbBodegasLicenciaUsuariosConsecutivos	Entradas1	Entradas2
ReferenciaSalidas1Salidas2Grupo
Traslados1
Traslados2SaldosBodegaUnidades	SubGruposSubcategoriasEstadoProducto)datetimeN)Image	ImageDraw	ImageFont)SQLAlchemyError)text)IntegrityError)check_password_hashr   )Decimal)func)
SQLAlchemy)UUIDc                   C   s   d tjtjtj ddS )N 
   k)joinrandomchoicesstringascii_lettersdigits r5   r5   /var/www/html/mig_web/app.pygenerar_password   s   r7   z)%(asctime)s - %(levelname)s - %(message)s)levelformatz/api/**T)originssupports_credentials)	resourcesz/postgresql://postgres:1234@localhost/INVENTARIOSQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONSzsmtp.gmail.comMAIL_SERVERiK  	MAIL_PORTMAIL_USE_TLSMAIL_USE_SSLzinfo@migsistemas.comMAIL_USERNAMEeejgelzxmgrfrkdhMAIL_PASSWORDMAIL_DEFAULT_SENDERzSELECT 1u$   Conexión a la base de datos exitosaz&Error al conectar a la base de datos: z/api/inventarioc               
   C   sL   ddddddddddd	dd
dddddddddddg} t | S )Nzicon-ordenesu   Órdenes de comprasiconr#   zicon-compraszCompras proveedorzicon-trasladoszTraslados a Bodegaszicon-entradaszEntradas a Bodegaszicon-salidaszSalidas a Bodegaszicon-consultazConsulta Inventariozicon-maxminu   Máximos y Mínimoszicon-fisico   Inventario Físicor&   )inventario_itemsr5   r5   r6   get_inventario_dataE   s   
rL   z/api/referenciasc                  C   sT   t jdd} tjtjd|  dtjd|  dB  }t	dd |D S )Nfiltror+   %c              
   S   s6   g | ]}|j |jt|jt|j|j|j|jd qS ))IdReferenciar   PrecioVenta1IVA	UbicacionidbodegaIdUnidad)rO   r   strrP   rQ   rR   rS   rT   .0refr5   r5   r6   
<listcomp>Z   s    
z#get_referencias.<locals>.<listcomp>)
r   argsgetr   queryfilterrO   ilikeallr   )rM   referenciasr5   r5   r6   get_referenciasS   s   ra   z/api/buscar_productos_editarGET)methodsc               
   C   s   t jdd} tjd|   z4tjtj	
d|  dtj
d|  dB d }tjdt|  dd |D }t|W S  tyi } ztjd	t|  td
didfW  Y d }~S d }~ww )Nbuscarr+   u   Búsqueda recibida: rN   2   zResultados encontrados: c                 S      g | ]}|j |j|jd qS )rO   r   IdGruporg   rV   r5   r5   r6   rY   q       
z+buscar_productos_editar.<locals>.<listcomp>u   Error en la búsqueda: erroru"   Error en la búsqueda de productos  )r   rZ   r[   apploggerinfor   r\   r]   rO   r^   limitr_   lenr   	Exceptionrj   rU   )busquedar`   	resultadoer5   r5   r6   buscar_productos_editard   s(   

ru   z	/api/testc                   C      t ddidfS )NmessagezAPI is working   r&   r5   r5   r5   r6   test_api}      ry   z(/api/buscar_productos_editar/<string:id>c              
   C   s
  z_t j| }ti d|jd|j d|jd|jd|jd|jd|j	dt
|jd	t
|jd
t
|jd|jd|jd|jd|jd|jd|jd|j|jt|dddW S  ty } ztjdt
|  tddidfW  Y d }~S d }~ww )NrO   r   rh   
idsubgrupoidsubcategoriarT   rS   CostorP   rQ   rR   Marcar   EstadoTipoManejaInventarioproductoagotado	compuestoF)modificaprecior   zError al obtener producto: rj   z&Error al obtener detalles del productork   )r   r\   
get_or_404r   rO   rh   r{   r|   rT   rS   rU   r}   rP   rQ   rR   r~   r   r   r   r   r   r   getattrrq   rl   rm   rj   )id
referenciart   r5   r5   r6   obtener_producto_editar   sZ   

	


r   z/api/maestrosc                  C   s   dddddddddd	dgd
dddddddddddddddddddddddddddddg	d
dd d!d"dgd
g} t | S )#Nzicon-tercerosTerceroszicon-clientesClientesrH   zicon-proveedoresProveedoreszicon-vendedoresz Vendedores - Meseros - Empleados)rI   r#   subitemszicon-productos	Productoszicon-gruposu   Grupos - Familias - Categoríaszicon-articulosu$   Productos - Artículos - Referenciaszicon-subgruposr   zicon-subcategoriasu   SubCategoríaszicon-lineasu   Líneaszicon-comentarioszGrupos comentarioszicon-descuentos
Descuentoszicon-unidadeszUnidad de medidaszicon-conectores
Conectoresz
icon-otrosOtroszicon-bodegasr   r&   )maestros_itemsr5   r5   r6   get_maestros_data   s6   
!r   z/api/consulta_inventarioc                  C   sd   t jtttjdd	ttj
tj
ktjt dk@ tjdk } tdd | D S )Nr   Saldo%Y%mTc                 S   sx   g | ]8\}}|j |j|jpd |jrt|jnd |jpd |jpd |jp#d |jp'd t||j	r2t|j	nd |j
p7d dqS )r+   )IDReferenciar   r~   Precio_Ventau
   Ubicaciónr   	ID_UnidadBodegar   r}   r   )rO   r   r~   rP   rU   rR   rh   rT   rS   r}   r   )rW   rX   saldor5   r5   r6   rY      s    
z+get_consulta_inventario.<locals>.<listcomp>)r   sessionr\   r   r(   coalescer   r   label	outerjoinrO   Mesr   nowstrftimer]   r   r_   r   r`   r5   r5   r6   get_consulta_inventario   s   
	r   z/api/bodegas)rb   POSTPUTc               
   C   s  t jdkr8t j} t| d | d | d | d| d| d| dd	}tj| tj  t	d
didfS t jdkrt j} tj
| d }|ry| d |_| d |_| d|_| d|_| d|_| d|_tj  t	d
didfS t	d
didfS tj
 }t	dd |D S )Nr   IdBodegaDescripcionr   Emailnombrepuntodireccionpuntotelefonopuntor   r   r   r   r   r   r   rw   zBodega creada exitosamente   r   zBodega actualizada exitosamenterx   Bodega no encontrada  c              
   S   s.   g | ]}|j |j|j|j|j|j|jd qS )r   r   )rW   bodegar5   r5   r6   rY      s    
z#manejar_bodegas.<locals>.<listcomp>)r   methodjsonr   r[   r   r   addcommitr   r\   r   r   r   r   r   r   r_   )datanueva_bodegar   bodegasr5   r5   r6   manejar_bodegas   s>   
	





r   z/api/estado_productor   c               
   C   s   t jdkr2ztj } tdd | D W S  ty1 } ztdt|ddfW  Y d }~S d }~ww t jdkr}z#t j}t|d |d	 |d
 d}t	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 d S )Nrb   c                 S   rf   )IdEstadoProductor   r   r   )rW   estador5   r5   r6   rY     ri   z+manejar_estado_producto.<locals>.<listcomp>Fsuccessrw   rk   r   r   r   r   r   T&Estado de Producto creado exitosamente  )r   r   r   r\   r_   r   rq   rU   r   r   r   r   r   rollback)estadosrt   r   nuevo_estador5   r5   r6   manejar_estado_producto  s6   


"


"r   z /api/estado_producto/<string:id>r   DELETEc              
   C   s   t j| }|stddddfS tjdkrSztj}|d |_ |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 tjdkrzt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 d S )NF Estado de Producto no encontrador   r   r   r   r   Tz+Estado de Producto actualizado exitosamenter   r   )Estado de Producto eliminado exitosamente)r   r\   r[   r   r   r   r   r   r   r   r   rq   r   rU   delete)r   r   r   rt   r5   r5   r6   "manejar_estado_producto_individual#  s4   




"


"r   c               
   C   s   t j} z"t| d | d | d d}tj| tj  tddddfW S  tyI } ztj	  td	d
t
| ddfW  Y d }~S d }~w tyl } ztj	  td	dt
| ddfW  Y d }~S d }~ww )Nr   r   r   r   Tr   r   r   FzError de integridad: r   zError: rk   )r   r   r   r   r   r   r   r   r$   r   rU   rq   )r   r   rt   r5   r5   r6   crear_estado_producto=  s&   

&
&r   c              
   C   s   t j| }|r>tj| z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 tddddfS )NTr   r   Fr   r   r   )r   r\   r[   r   r   r   r   r   rq   r   rU   )r   r   rt   r5   r5   r6   eliminar_estado_productoP  s   

"r   z/api/unidadesc               
   C   s   t j} | rd| vsd| vrtddidfS t| d | d | ddd}ztj| tj  td	|j	|j
|jdd
dfW S  tya } ztj  tdt|idfW  Y d }~S d }~ww )NrT   Unidadrj   zDatos incompletosr   r   TrT   r   r   zUnidad creada exitosamente)rw   unidadr   rk   )r   r   r   r   r[   r   r   r   r   rT   r   r   rq   r   rU   )r   nueva_unidadrt   r5   r5   r6   crear_unidad^  s2   


 r   c                  C      t j } tdd | D S )Nc                 S   rf   )r   r   rW   ur5   r5   r6   rY   }  ri   z$obtener_unidades.<locals>.<listcomp>)r   r\   r_   r   unidadesr5   r5   r6   obtener_unidadesz  s   
r   z/api/unidades/activasc                  C   $   t jjdd } tdd | D S )NTr   c                 S      g | ]	}|j |jd qS )rT   r   r   r   r5   r5   r6   rY     
    
z,obtener_unidades_activas.<locals>.<listcomp>)r   r\   	filter_byr_   r   r   r5   r5   r6   obtener_unidades_activas  s   r   z/api/subgruposc                  C   sr   t jdkr+t j} t| d | d | d | d d}tj| tj  tddid	fS tj	
 }td
d |D S )Nr   
IdSubgrupoSubgruporh   r   r   r   rh   r   rw   zSubgrupo creado exitosamenter   c                 S   "   g | ]}|j |j|j|jd qS r   r   rW   sr5   r5   r6   rY         
z%manejar_subgrupos.<locals>.<listcomp>)r   r   r   r   r   r   r   r   r   r\   r_   )r   nuevo_subgrupo	subgruposr5   r5   r6   manejar_subgrupos  s   


r   z/api/subgrupos/<string:id>c                 C   sB   t j| }|rtj| tj  tddiS tddidfS )Nrw   zSubgrupo eliminado exitosamentezSubgrupo no encontrador   )r   r\   r[   r   r   r   r   r   )r   subgrupor5   r5   r6   eliminar_subgrupo  s   
r   z/api/gruposc               
   C   s   t jdkr:ztj } tdd | D W S  ty9 } ztdt| tddt| idfW  Y d }~S d }~ww t jdkrzkt j	}t
jd	|  tj|d
 }|rst
jd|d
   |d |_|d |_|d |_d}n#t
jd|d
   t|d
 |d |d |d d}tj| d}tj  t
jd td|ddfW S  ty } ztj  tdt| tddidfW  Y d }~S d }~w ty } z"tj  t
jdt|  tddt| idfW  Y d }~S d }~ww t
jdt j  tddidfS )Nrb   c                 S   r   ))codigodescripcionr   menuposrh   r   r   r   rW   grupor5   r5   r6   rY     r   z"manejar_grupos.<locals>.<listcomp>zError al obtener grupos:rj   zError al obtener grupos: rk   r   zProcesando datos POST: r   zActualizando grupo existente: r   r   r   zGrupo actualizado exitosamentezCreando nuevo grupo: r   zGrupo creado exitosamenteu1   Operación en base de datos completada con éxitoTr   rx   zError de integridad:uC   El código de grupo ya existe. Por favor, use un código diferente.r    Error al procesar la solicitud: Error inesperado: u   Método no soportado: u   Método no soportadoi  )r   r   r   r\   r_   r   rq   printrU   r   rl   rm   rn   r[   r   r   r   r   r   r   r$   r   rj   warning)gruposrt   r   grupo_existentemensajenuevo_grupor5   r5   r6   manejar_grupos  s^   


$






$r   z/api/bodegas/<string:id>c              
   C      z%t j| }|rtj| tj  tdddW S tddddfW S  tyG } ztj	  tdt
|ddfW  Y d }~S d }~ww )NTzBodega eliminada exitosamenter   Fr   r   rk   )r   r\   r[   r   r   r   r   r   rq   r   rU   )r   r   rt   r5   r5   r6   eliminar_bodega     

"r   c                 C   s<   t jj| d }|r|j|krtdddS tdddS )N	IdUsuarioT   Inicio de sesión exitosor   F   Credenciales inválidas)r   r\   r   first   Contraseñar   )
id_usuario   contraseñausuarior5   r5   r6   verificar_credenciales  s   r  /c                   C      t dS )Nz
login.htmlr   r5   r5   r5   r6   index     r	  z
/api/loginc               
   C   s   zSt j} | stddddfW S | d}| d}|r|s(tddddfW S tjj|d }|rJ|j|krJtd	d
|j	|j
|j|jddW S tddddfW S  ty| } ztdt|  tddt| ddfW  Y d }~S d }~ww )NFzNo se proporcionaron datosr   r   usernamepasswordu$   Usuario y contraseña son requeridosr   Tr   )r   r   r   email)r   rw   userr   i  zError en el servidor: rk   )r   r   r   r[   r   r\   r   r   r  r   r   r   r  rq   r   rU   )r   r  r  r  rt   r5   r5   r6   login  s2   


(r  z$/api/consecutivos_salidas_inventarioc               
   C   b   zt jjddd } tdd | D W S  ty0 } ztdt|idfW  Y d }~S d }~ww )NSALT
Formularior   c                 S   r   )IdConsecutivor   PrefijoActualr  Consecutivor  r  rW   cr5   r5   r6   rY     r   z;obtener_consecutivos_salidas_inventario.<locals>.<listcomp>rj   rk   r   r\   r   r_   r   rq   rU   consecutivosrt   r5   r5   r6   'obtener_consecutivos_salidas_inventario     
 r  z&/api/consecutivos_traslados_inventarioc               
   C   r  )NTBTr  c                 S   r   r  r  r  r5   r5   r6   rY   *  r   z=obtener_consecutivos_traslados_inventario.<locals>.<listcomp>rj   rk   r  r  r5   r5   r6   )obtener_consecutivos_traslados_inventario%  r   r"  z/api/guardar_trasladoc                  C   s  t j} | di }| dg }z
td(i d|dd|dd|ddd|dd|dd	|d	d
t|d
d|dd|ddt|ddtt|dddtt|dddtt|dddtt|dddtt|dddtt|dddtt|dd}tj	
| |D ]_}t|d|d|d|dtt|ddtt|ddtt|dd|dtt|ddtt|ddtt|ddtt|d dd!}tj	
| qtj	  td"d#d$W S  ty@ } ztj	  tdd%t| d$d&fW  Y d }~S d }~w tye } ztj	  tdd't| d$d&fW  Y d }~S d }~ww ))N	traslado1
traslados2Numeror   AnuladoFIdBodegaOrigenIdBodegaDestinoObservacionesFechaCreacionr   r  fechasubtotal0	total_ivatotal_impoconsumo	total_ipc
total_ibua
total_icuitotalIDrO   r   CantidadValorrQ   idunidadimpoconsumoipcimp_ibuaimp_icui)r4  r%  rO   r   r5  r6  rQ   r7  r8  r9  r:  r;  Tu   Traslado guardado con éxitor   Error de base de datos: rk   r   r5   )r   r   r[   r   r   fromisoformatr'   rU   r   r   r   r   r   r   r"   r   rq   )r   traslado1_datatraslados2_datanuevo_traslado1	traslado2nuevo_traslado2rt   r5   r5   r6   guardar_traslado3  s   






	


(
(rC  z!/api/ultimo_consecutivo_trasladosc               
   C      z&t jjdd } | r| j | jd }td|dW S tdddW S  tyA } ztdt	|dW  Y d }~S d }~ww )	Nr!  r     Tr   ultimoConsecutivoF;   No se encontró el consecutivo para Traslados de Inventarior   
r   r\   r   r   r  r  zfillr   rq   rU   consecutivoultimo_consecutivort   r5   r5   r6   ultimo_consecutivo_trasladosi     rO  z%/api/actualizar_consecutivo_trasladosc               
   C   s   z5t jjdd } | r.tt| jd d| _tj	
  | j | j }td|dW S tddd	W S  tyU } ztj	  tdt|d	W  Y d }~S d }~ww )
Nr!  rE     rF  Tr   nuevoConsecutivoFrI  r   )r   r\   r   r   rU   intr  rK  r   r   r   r  r   rq   r   )rM  nuevo_consecutivort   r5   r5   r6    actualizar_consecutivo_trasladosu  s   

rV  z/api/referencias/<string:id>c              
   C   s   z1t j}tj| }|stddidfW S | D ]
\}}t||| qtj	
  tddidfW S  tyU } ztj	  tddt| idfW  Y d }~S d }~w tyx } ztj	  tddt| id	fW  Y d }~S d }~ww )
Nrw   zReferencia no encontradar   #Referencia actualizada exitosamenterx   z)Error de integridad en la base de datos: r   z#Error al actualizar la referencia: rk   )r   r   r   r\   r[   r   itemssetattrr   r   r   r$   r   rU   rq   )r   r   r   keyvaluert   r5   r5   r6   actualizar_referencia  s$   

&
&r\  c                  C   r   )Nc                 S   &   g | ]}|j |j|j|j|jd qS ))r   r   r   r   ultimoCodigo)rh   r   r   r   r^  r   r5   r5   r6   rY         
z"obtener_grupos.<locals>.<listcomp>)r   r\   r_   r   )r   r5   r5   r6   obtener_grupos  s   
r`  z/api/grupos_subcategoriasc               
   C   s|   zt jjdd } dd | D }td| t|W S  ty= } ztdt|  tddid	fW  Y d }~S d }~ww )
NTr   c                 S   r   )rh   r   ra  r   r5   r5   r6   rY     r   z0obtener_grupos_subcategorias.<locals>.<listcomp>u%   Grupos para subcategorías obtenidos:u-   Error al obtener grupos para subcategorías: rj   u+   Error al obtener grupos para subcategoríasrk   )r   r\   r   r_   r   r   rq   rU   r   grupos_datart   r5   r5   r6   obtener_grupos_subcategorias  s   

rd  z/api/guardar_entradac            
      C   s  t j} | di }| dg }td|   ztd-i d|dd|dd|ddd|dd	|d	d
t|d
d|dd|ddt|ddtt	|dddtt	|dddtt	|dddtt	|dddtt	|dddtt	|dddtt	|dd}t
j| t d}|D ]p}|dstd|  qt|d|d|d|dtt	|ddtt	|ddtt	|ddtd|dtt	|ddtt	|d dtt	|d!dtt	|d"dd#}t
j| qt d}|D ]`}tjj|d ||d d$ }|rl| jtt	|d 7  _| jtt	|d 7  _|d%rj|d% |_q1t|d ||d tt	|d tt	|d |d%d&d'}t
j| q1t
j  td(d)d*W S  ty }	 zt
j  tdd+t	|	 d*d,fW  Y d }	~	S d }	~	ww ).Nentrada1	entradas2Datos recibidos: r%  r   r&  Fr   r)  r*  r   r  r+  r,  r-  r.  r/  r0  r1  r2  r3  r   rO   u/   Entrada ignorada debido a IdReferencia vacío: r4  r   r5  r6  rQ   r7  r8  r9  r:  r;  )r4  r%  rO   r   r5  r6  rQ   	Descuentor7  r8  r9  r:  r;  r   r   rO   loter+   )r   r   rO   Entradasr   rj  Tu/   Entrada guardada y saldo actualizado con éxitor   zError al guardar la entrada: rk   r5   )r   r   r[   loggingrn   r   r   r=  r'   rU   r   r   r   r   r   r   r   r   r\   r   r   rk  r   rj  r   r   rq   r   )
r   entrada1_dataentradas2_datanueva_entrada1
mes_actualentrada2nueva_entrada2r   nuevo_saldort   r5   r5   r6   guardar_entrada  s   





	





(rt  z/api/importar-productosc                  C   s   t j} | D ]3}t|d |d |d |d |d |d |d |d |d	 |d
 |d |d |d d}tj| qztj  tddidfW S  tyk } ztj	  tddt
| idfW  Y d }~S d }~ww )NrO   r   r~   r   rh   rT   rR   r}   rP   rQ   r   r   r   )rO   r   r~   r   rh   rT   rR   r}   rP   rQ   r   r   r   rw   z!Productos importados exitosamenterx   rj   zError al importar productos: rk   )r   r   r   r   r   r   r   r   rq   r   rU   )	productosproductonueva_referenciart   r5   r5   r6   importar_productos	  s4   

&rx  z/api/subcategoriasc               
   C   s   t jdkrtj } tdd | D S t jdkrdt j}t|d |d |d |d |d	 d
}tj	| ztj
  tddidfW S  tyc } ztj  tdt|idfW  Y d }~S d }~ww d S )Nrb   c                 S   r]  )r|   	categoriaidgrupor{   r   ry  r   r5   r5   r6   rY   )  r_  z)manejar_subcategorias.<locals>.<listcomp>r   r|   rz  r{  r{   r   ry  rw   u!   Subcategoría creada exitosamenter   rj   r   )r   r   r   r\   r_   r   r   r   r   r   r   rq   r   rU   )subcategoriasr   nueva_subcategoriart   r5   r5   r6   manejar_subcategorias%  s0   




 r~  z/api/subcategorias/<string:id>)rb   r   r   c              
   C   s>  t j| }tjdkrt|j|j|j|j	|j
dS tjdkrdtj}|d |_|d |_|d |_	|d |_
ztj  tdd	iW S  tyc } ztj  td
t|idfW  Y d }~S d }~ww tjdkrtj| ztj  tddiW S  ty } ztj  td
t|idfW  Y d }~S d }~ww d S )Nrb   ry  r   rz  r{  r{   r   rw   u&   Subcategoría actualizada exitosamenterj   r   r   u$   Subcategoría eliminada exitosamente)r   r\   r   r   r   r   r|   rz  r{  r{   r   r   r   r   r   rq   r   rU   r   )r   subcategoriar   rt   r5   r5   r6   manejar_subcategoria_individualB  sD   







 


 r  z/api/obtener_grupos_subgruposc               
   C   sr   zt jjdd } dd | D }t|W S  ty8 } ztdt|  tddidfW  Y d }~S d }~ww )	NTr   c                 S   r   ))r   r   ra  r   r5   r5   r6   rY   i  r   z,obtener_grupos_subgrupos.<locals>.<listcomp>z(Error al obtener grupos para subgrupos: rj   z&Error al obtener grupos para subgruposrk   )r   r\   r   r_   r   rq   r   rU   rb  r5   r5   r6   obtener_grupos_subgrupose  s   
r  c               
   C   sj   zt j } dd | D }t|W S  ty4 } ztdt|  tddidfW  Y d }~S d }~ww )Nc                 S   r   r   r   rW   r   r5   r5   r6   rY   v  r   z%obtener_subgrupos.<locals>.<listcomp>Error al obtener subgrupos: rj   Error al obtener subgruposrk   )r   r\   r_   r   rq   r   rU   )r   subgrupos_datart   r5   r5   r6   obtener_subgruposr  s   

r  z /api/subgrupos/<string:id_grupo>c              
   C   st   zt jj| dd }dd |D }t|W S  ty9 } ztdt|  tddidfW  Y d }~S d }~ww )	NT)rh   r   c                 S   r   )r   r   r  r  r5   r5   r6   rY     r   z/obtener_subgrupos_por_grupo.<locals>.<listcomp>r  rj   r  rk   )r   r\   r   r_   r   rq   r   rU   )id_grupor   r  rt   r5   r5   r6   obtener_subgrupos_por_grupo  s   
r  z/api/grupos/<string:id>c              
   C   r   )NTzGrupo eliminado exitosamenter   FGrupo no encontrador   rk   )r   r\   r[   r   r   r   r   r   rq   r   rU   )r   r   rt   r5   r5   r6   eliminar_grupo  r   r  z/api/grupos/<codigo>c                 C   s   t j| }td|d uiS )Nexists)r   r\   r[   r   )r   r   r5   r5   r6   verificar_grupo  s   r  c                    sH   t jt j| t j  tdd  D  t fdd| D S )Nc                 s   s    | ]}|d  V  qdS )r   Nr5   )rW   rr5   r5   r6   	<genexpr>      z0verificar_referencias_existen.<locals>.<genexpr>c                 3   s    | ]}| v V  qd S Nr5   rV   
existentesr5   r6   r    r  )r   r\   r]   rO   in_with_entitiesr_   setr   r5   r  r6   verificar_referencias_existen  s    r  z/maestros/bodegasc                   C   r  )Nzbodegas.htmlr  r5   r5   r5   r6   pagina_bodegas  r
  r  z/api/configuracionc                  C   s2   t jdkrt j} tddidfS ddd}t|S )Nr   rw   u'   Configuración actualizada exitosamenterx   zMIG-ALMACEN, TEXTILzXXXX-XXXX-XXXX-XXXX)empresalicenciar   r   r   r   )r   configuracionr5   r5   r6   manejar_configuracion  s   
r  c           
      C   s   t | d}d}|| | }t| }| }t | d d }dt	j
tjtj dd}| d| d|dd   }	|	S )	Nzutf-8MIGSistemas2024   r+      r-   -)base64	b64decodedecodehashlibsha256encodedigest	b64encoder/   r0   r1   r2   ascii_uppercaser4   )
caracteristicas_equiponitcaracteristicasclave_secretadatoshash_objeto
hash_byteslicencia_basecaracteres_aleatoriosr  r5   r5   r6   generar_licencia  s   r  c                 C   s   zLt dtjd ddgd}d| j d| j d| j d	| j d
| j d| jr(| jnd d| d| d|_	t
dd|j  t| t
d W dS  tys } zt
dt|  t
dt   W Y d }~dS d }~ww )NzNueva Licencia GeneradarG   riosjuan3053@gmail.comzjohnsod8729@gmail.comsender
recipientszB
        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/Au3   

        Información de acceso:
        Usuario: u   
        Contraseña: uZ   

        Por favor, cambie su contraseña después del primer inicio de sesión.
        zIntentando enviar correo a z, zCorreo enviado exitosamenteTzError al enviar correo: Detalles del error: F)r
   rl   configr  razonsocialnombrecomercialnumerolicenciatipolicenciafechavencimientobodyrl  rn   r/   r  mailsendrq   rj   rU   	traceback
format_exc)r  r  r  msgrt   r5   r5   r6   enviar_correo  s@   


r  c                   C   s   t jdtjtj d S )NzRuta solicitada: %s %s)rl   rm   rn   r   r   pathr5   r5   r5   r6   log_request_info  s   r  c                 C   s&   t jd| j t jd|   | S )NzResponse Status: %szResponse: %s)rl   rm   debugstatusget_data)responser5   r5   r6   log_response_info  s   r  z/api/solicitar_licenciac            
      C   s`  zt j} td|   g d}|D ]}|| vs| | s,tdd| dddf  W S qt| d | d	 }td
|  t|| d	 | d | d | d | d | d | d || d | d | d dkrpd| v rpt| d d	 nd d}t
j| | d	 }t }t||d| d  dd}t
j| t
j  td t|||}|std tdd||j|j|j|j|j|jr|j nd dddfW S  ty }	 z#t
j  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t  tdd"t|	 dd!fW  Y d }	~	S d }	~	ww )#Nrg  )
r  r  r  ubicacioncomercialciudadtelefonoversioncantidadusuarior  r  Fz	El campo u%    es requerido y no puede estar vacíor   r   r  r  u   Número de licencia generado: r  r  r  r  r  r  r  r  RENTAr  %Y-%m-%d)r   r  r  r  r  r  r  r  r  r  r  r  zUsuario para Tr   r  r   r   z:Licencia y usuario creados y guardados en la base de datoszLEl correo no pudo ser enviado, pero la licencia y el usuario fueron creados.zLicencia creada exitosamente)r  r  r  r  r  r  )r   rw   correoEnviador  r   r<  rk   r   ) r   r   rl  rn   r   r  r   r   strptimedater   r   r   r7   r   r   r  r   r  r  r  r  r  r  	isoformatr"   r   rj   rU   rq   r  r  )
r   campos_requeridoscamponumero_licencianueva_licenciar  r  nuevo_usuariocorreo_enviadort   r5   r5   r6   solicitar_licencia  s    *



(
(r  z/api/verificar_licenciac                  C   sx   t j} | d }| d }tjj||d }|r5|jdkr/|jr/|jt	 
 k r/tdddS tdd	iS tdd
dS )Nr  r  )r   r  r  FzLa licencia ha expirado)validarw   r  TzLicencia no encontrada)r   r   r   r\   r   r   r  r  r   r   r  r   )r   licencia_ingresadar  r  r5   r5   r6   verificar_licencia6  s   
r  z/api/entradas_inventarioc               
   C   s   t j} t| d | d | d | d | d | d d}tj| | d D ](}t| d  d	|d
  | d |d
 |d |d |d |d d}tj| q#tj  tddidfS )Nr%  r   r   r)  r   r  )r%  r   r   r)  r   r  detalles_rO   r   r5  r6  Idunidad)r4  r%  rO   r   r5  r6  r  rw   z)Entrada de inventario creada exitosamenter   )	r   r   r   r   r   r   r   r   r   )r   nueva_entradadetallenuevo_detaller5   r5   r6   crear_entrada_inventarioJ  s.   	
r  z/api/consecutivos_disponiblesc                  C   r   )NTr   c                 S   r   )r  r  r  r  r5   r5   r6   rY   j      z4obtener_consecutivos_disponibles.<locals>.<listcomp>)r   r\   r   r_   r   r  r5   r5   r6    obtener_consecutivos_disponiblesg     r  z/api/consecutivosc                  C   r   )Nc                 S   sZ   g | ])}|j |j|j|j|j|j|j|j|jr|j	d nd|j
|j|j|j|jdqS r  Nr  r  r  r  DesdeHastar  
ResolucionFechaResolucionObservacionesResolucionr   Comprobantefechafinresoluciontiporesolucionr  r  r  r  r  r  r  r  r  r   r  r   r  r  r  r  r5   r5   r6   rY   o  s"    
z(obtener_consecutivos.<locals>.<listcomp>)r   r\   r_   r   r  r5   r5   r6   obtener_consecutivosl  s   
r  z/api/bodegas_disponiblesc                  C   r   )NTr   c                 S   r   )r   r   r  )rW   br5   r5   r6   rY     r  z/obtener_bodegas_disponibles.<locals>.<listcomp>)r   r\   r   r_   r   )r   r5   r5   r6   obtener_bodegas_disponibles  r  r  z%/api/consecutivos_entradas_inventarioc               
   C   r  )NEITr  c                 S   r   r  r  r  r5   r5   r6   rY     r   z<obtener_consecutivos_entradas_inventario.<locals>.<listcomp>rj   rk   r  r  r5   r5   r6   (obtener_consecutivos_entradas_inventario  r   r  z /api/ultimo_consecutivo_entradasc               
   C   rD  )	Nr   rE  rF  TrG  F:   No se encontró el consecutivo para Entradas de Inventarior   rJ  rL  r5   r5   r6   ultimo_consecutivo_entradas  rP  r  z /api/salidas_inventario_informesc                  C     t jd tjd} tjd}t jd|  d|  | r"|s*tddidfS zt| d		 } t|d		 }W n t
yM   tdd
idf Y S w zotjtj| | }g }|D ]H}tjj|jd }|D ]9}||j|jr}|jdnd |j|j|jd urt|jnd |jd urt|jnd |jd urt|jnd d qnq`t jdt|  t|t|dW S  ty } zt jdt |  tddt | idfW  Y d }~S d }~ww )Nu0   Función get_salidas_inventario_informes llamadafecha_inicio	fecha_finFechas recibidas: inicio=, fin=rj   #Se requieren fechas de inicio y finr   r     Formato de fecha inválidor%  %Y-%m-%d %H:%M:%Sr%  FecharO   r   r5  r6  Totalu    Número de salidas encontradas: )salidastotal_salidasz*Error en get_salidas_inventario_informes: Error al obtener los datos: rk   )!rl   rm   rn   r   rZ   r[   r   r   r  r  
ValueErrorr   r\   r]   r+  betweenr_   r   r   r%  appendr*  r   rO   r   r5  floatr6  r3  rp   rq   rj   rU   )r  r  salidas1rs   s1salidas2s2rt   r5   r5   r6   get_salidas_inventario_informes  L   

&r  z/api/saldos_bodegasc                  C   sd   t jd} t jd}t d}tjj||| d	 }|r.t
|j|jt|jdgS t
g S )NidReferenciaidBodegar   ri  )rO   r   r   )r   rZ   r[   r   r   r   r   r\   r   r   r   rO   r   r  r   )id_referencia	id_bodegarp  r   r5   r5   r6   get_saldos_bodegas  s"   
r!  z/api/licencia/<nit>c                 C   sr   t jj| d }|r0td|j|j|j|j|j	|j
|j|j|j|j|jr)|j nd ddS tddddfS )	Nr  T)r  razonSocialnombreComercialubicacionComercialr  r  r  numeroLicenciacantidadUsuariostipoLicenciafechaVencimiento)r   r  F2   No se encontró licencia para el NIT proporcionador   r   )r   r\   r   r   r   r  razon_socialnombre_comercialubicacion_comercialr  r  r  r  cantidad_usuariostipo_licenciafecha_vencimientor  )r  r  r5   r5   r6   obtener_licencia_por_nit  s$   r1  z"/api/generar_imagen_licencia/<nit>c              
   C   s  t jj| d }|rztjdddd}t|}tj	
tjddd}t|}|d	}||d
|jdkr:|nd  tj	
tjddd}t|}|d}||d|jdkr\|nd  tj	
tjddd}t|d}	|jdd|	dd |jdd|	dd |jddt d |	dd |jdd|	dd |jd|j |	dd |jd|j |	dd |jdd |	dd |jd!d"|j |	dd |jd#d$|j |	dd |jd%d&|j |	dd |jd'd(|j |	dd |jd)d*|j |	dd |jd+d,|j |	dd |jd-d.|j |	dd |jd/d0|j |	dd |jd1d2|j |	dd |jd3d4|j  |	dd |j!rM|jd5d6|j! |	dd |jd7d8|	dd |jd9d:|	dd |jd;d<|	dd |jd=d>|	dd |jd?d@|	dd |jdAdB|	dd t"# }
|$|
dC |
%dD t&|
dEdFW S  t'y } zt()dGt*|  t+dHdIdJdKfW  Y d }~S d }~ww t+dHdLdJdMfS )NNr"  RGB)i   X  )   r4  r4  )colorstaticimgzLogo.png)d   r8  )r,   r,   RGBAz	firma.png)   re   )r3  rk   fontsz	arial.ttfr  )r,   x   z*www.migsistemas.com - info@migsistemas.com)r   r   r   )fontfill)r,      zCel: 300 225 7898)r,      u   Medellín, z%d de %B de %Y)r,      u   Señores)r,      )r,   i  )r,   i,  z#REF: Licenciamiento De Software MIG)r,   iT  zNIT: )r,   ih  u   RAZÓN SOCIAL: )r,   i|  zNOMBRE COMERCIAL: )r,   r   u   UBICACIÓN COMERCIAL: )r,   i  zCIUDAD: )r,   i  u   TELÉFONO: )r,   i  u
   VERSIÓN: )r,   i  zNUMERO DE LICENCIA: )r,   rk   zCANTIDAD DE USUARIOS: )r,   i  zTIPO LICENCIA: )r,   i  zFECHA DE VENCIMIENTO: )r,   D  zJLo anterior se expide para cumplimiento de requisitos exigidos por la ley,)r,   r3  zpara legalidad y autenticidad.)r,   i  z(Cualquier duda con gusto la aclararemos.)r3  i0  zMARY PARRA G.)r3  rC  zSISTEMAS MIG S.A.S)r3  r3  zNIT: 900.275.400-8PNGr   z	image/png)mimetypez+Error al generar la imagen de la licencia: Fz)Error al generar la imagen de la licenciar   rk   r*  r   ),r   r\   r   r   r   newr    Drawosr  r/   rl   	root_pathopenresizepastemoder!   truetyper#   r   r   r   r,  r  r  r+  r-  r  r  r  r.  r/  r0  ioBytesIOsaveseekr   rq   rl  rj   rU   r   )r  r  r7  d	logo_pathlogo
firma_pathfirma	font_pathr=  img_iort   r5   r5   r6   generar_imagen_licencia  sd   




"
rZ  z/test_emailc               
   C   s`   zt dtjd dgd} d| _t|  W dS  ty/ } zdt| W  Y d }~S d }~ww )NzTest Email desde FlaskrG   r  r  u?   Este es un correo de prueba enviado desde la aplicación Flask.zVCorreo de prueba enviado. Por favor, verifica tu bandeja de entrada y carpeta de spam.z%Error al enviar el correo de prueba: )r
   rl   r  r  r  r  rq   rU   )r  rt   r5   r5   r6   
test_email6  s   
r[  r   c                 C   rv   )Nrj   zRecurso no encontrador   r&   rj   r5   r5   r6   not_found_errorB  rz   r]  rk   c                 C   s   t j  tddidfS )Nrj   zError interno del servidorrk   )r   r   r   r   r\  r5   r5   r6   internal_errorF  s   
r^  c                  C   s*   t jdkrt j} td| dS tddiS )Nr   zPOST recibido)rw   r   rw   u   Conexión exitosar  )r   r5   r5   r6   
test_routeK  s   
r_  z/pingc                   C   s   dS )Npongr5   r5   r5   r5   r6   pingU  s   ra  c            
         s   d,dd} dd }dd  t jdv rt j}td| t| |d	| |d
|| |d| |d| |d| |d| |d| |d| |drNt| |dd nd | |d| |dd| |d| |d| |dd}td| t jdkrtd-i |}t	j
| n"tj|d	 }|r| D ]
\}}t||| qntddidfS zt	j
  tddt jdkrd nd! d"id#fW S  ty } z"t	j
  tdd$t jdkrd%nd& d't| id(fW  Y d }~S d }~ww t jd)krtj }	t fd*d+|	D S d S ).Nc                 S   s   |  |}|dvr|S |S )N)Nr+   null	undefinedr[   )r   rZ  defaultr[  r5   r5   r6   	get_value[  s   
z'manejar_consecutivos.<locals>.get_valuec                 S   s8   ddddddddd	d
dddd}| | | d d  S )NCMCOTCCDCr   GASOCPEDREMr  SMr!  IF)   Compras de MercancíaCotizacionesCuentas de Cobro   Devolución de ComprasEntradas de InventarioGastosOrdenes de CompraPedidos
RemisionesSalidasSolicitud de MaterialesTraslados de BodegarJ      )r[   upper)
formulariomapeo_formulariosr5   r5   r6   obtener_iniciales_  s   z/manejar_consecutivos.<locals>.obtener_inicialesc                 S   s,   ddddddddd	d
dddd}| | | S )Nrq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  rJ   )rg  rh  ri  rj  r   rk  rl  rm  rn  r  ro  r!  rp  rd  )	inicialesmapeo_inversor5   r5   r6   obtener_nombre_completoq  s   z5manejar_consecutivos.<locals>.obtener_nombre_completo)r   r   zDatos recibidos:r  r  r  r  r  r  r  r  FechaInicioResolucionr  r)  ActivoTTipoDocumentoFacturaFechaFinResolucionr   r  zDatos procesados:r   rw   zConsecutivo no encontrador   zConsecutivo creadoactualizadoz exitosamenterx   z	Error al crear
actualizarz el consecutivo: rk   rb   c                    s^   g | ]+}|j |j |j|j|j|j|j|j|jr|j	d nd|j
|j|j|j|jdqS r  r  r  r  r5   r6   rY     s"    
z(manejar_consecutivos.<locals>.<listcomp>r  r5   )r   r   r   r   rT  r   r  r  r   r   r   r   r\   r[   rX  rY  r   r   rq   r   rU   r_   )
rf  r  r   consecutivo_datarU  rM  rZ  r[  rt   r  r5   r  r6   manejar_consecutivosY  sZ   


"



(
:

r  z/api/consecutivos/<int:id>c                 C   s   t j| }tjdkr<t|j|j|j|j	|j
|j|j|j|j|jr&|j nd |jr/|j nd |j|j|j|jdS tjdkrxztj| tj  tddiW S  tyw } ztj  tddt| idfW  Y d }~S d }~ww d S )Nrb   )r  r  r   r  r  r  r  r  r  r  r  r  r)  r   r   r   rw   z"Consecutivo eliminado exitosamentez"Error al eliminar el consecutivo: rk   )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   r   rq   r   rU   )r   rM  rt   r5   r5   r6   manejar_consecutivo_individual  s<   



&r  z$/api/consecutivo_entradas_inventarioc                  C   s@   t jjdd } | rt| j| j| j| jdS tddidfS )Nr   rE  r  rj   r  r   )	r   r\   r   r   r   r  r  r  r  )rM  r5   r5   r6   'obtener_consecutivo_entradas_inventario  s   r  z$/api/actualizar_consecutivo_entradasc               
   C   s   z7t jjdd } | r0t| j}t|d d| _tj	
  | j | j }td|dW S tddd	W S  tyW } ztj	  tdt|d	W  Y d }~S d }~ww )
Nr   rE  rQ  rF  TrR  Fr  r   )r   r\   r   r   rT  r  rU   rK  r   r   r   r  r   rq   r   rM  actualrU  rt   r5   r5   r6   actualizar_consecutivo_entradas  s   


r  z/api/verificar_inventarioc                  C   sz   t jd} t jd}t d}tjj||| d	 }|r0|j
|j |j |j |j }nd}t|dkt|dS )Nr  r  r   ri  r   )
disponiblesaldoDisponible)r   rZ   r[   r   r   r   r   r\   r   r   SaldoInicialrk  Comprasrz  Ventasr   r  )r  r   rp  r   saldo_disponibler5   r5   r6   verificar_inventario  s"    r  c               
   C   sR  t j} | d}| dd}|d ur'|d ur't|}t|}|d|d   }nd }i d| dd| d	d
| dd| dd| dpId d| dpQd d|d|d| dp_d d| dpgd d| ddd| ddd| dd d| d dd!| d"dd#| d$pd d%| d&pd d'| d(pd i}z9tj|d }|r| D ]
\}}t||| qd)}ntd0i |}	tj	
|	 d*}tj	  td+|id,fW S  ty }
 ztj	  td+d-t|
 id.fW  Y d }
~
S d }
~
w ty( }
 ztj	  td+d/t|
 id.fW  Y d }
~
S d }
~
ww )1NprecioVenta1ivar   rQ  r8  rO   r   r   r   rh   r   rT   r   rR   	ubicacionr}   costorP   rQ   r~   marcar   estadoProductor   activoTr   
esServicioFr   r   agotador   modificaPrecior{   r   r|   r  rS   r   rW  Referencia creada exitosamenterw   rx   zError en la base de datos: rk   r   r5   )r   r   r[   r  r   r\   rX  rY  r   r   r   r   r   r"   r   rU   rq   )r   precio_sin_ivaiva_porcentajeprecio_con_ivareferencia_datar   rZ  r[  r   rw  rt   r5   r5   r6   manejar_referencias  s   




	


&
&r  c               
   C   s   t jdd} t jdd}t d}td}ztj	|d|  d||d}dd	 |D }t
|W S  tyW } ztd
t|  t
ddidfW  Y d }~S d }~ww )NrM   r+   r  r   af  
        SELECT 
            r."IdReferencia", 
            r."Referencia", 
            r."PrecioVenta1", 
            r."IVA", 
            r."Ubicacion", 
            r."idbodega", 
            r."IdUnidad", 
            COALESCE(s."Saldo", 0) as Saldo
        FROM 
            referencias r
        LEFT JOIN 
            "SaldosBodega" s
        ON 
            r."IdReferencia" = s."IdReferencia"
            AND s."IdBodega" = :id_bodega
            AND s."Mes" = :mes_actual
        WHERE 
            (r."IdReferencia" ILIKE :filtro OR r."Referencia" ILIKE :filtro)
            AND r."Estado" = True
    rN   )rM   r   rp  c                 S   s>   g | ]}|j |jt|jt|j|j|j|jt|jd qS ))rO   r   rP   rQ   rR   rS   rT   r   )	rO   r   rU   rP   rQ   rR   rS   rT   r   )rW   rowr5   r5   r6   rY   m  s    	
z'obtener_referencias.<locals>.<listcomp>zError al obtener referencias: rj   zError al obtener referenciasrk   )r   rZ   r[   r   r   r   r#   r   r   executer   rq   r   rU   )rM   r   rp  r\   resultr`   rt   r5   r5   r6   obtener_referenciasI  s&   
	
r  z/api/salidas_inventarioc                  C   s   t j} t| d | d | d | d t | d | d | d d}tj| | d	 D ]+}t| d  d
|d  | d |d |d |d |d |d |d d}tj| q)tj	  t
ddddfS )Nr%  r   r   r)  r   r  r  )r%  r   r   r)  r*  r   r  r  r  r  rO   r   r5  r6  Subtotalr  r4  r%  rO   r   r5  r6  r  r  Tz(Salida de inventario creada exitosamenter   r   )r   r   r   r   r   r   r   r   r   r   r   )r   nueva_salidar  r  r5   r5   r6   crear_salida_inventario}  s4   


r  z/api/guardar_salidac                  C   s  t j} | di }| dg }zt  td5i d|d d|d d|d d|d d|dd|dd	|d	d
t|d
 ddd|dd|dd|drat|d nd d|d d|ddt|d dtt|dddtt|dddtt|dddtt|dddtt|dddtt|dddtt|dd}t	j
| t d}|D ]}|d sqtj|d }|stdd|d  dd d!f  W S t|d" |d |d |d# tt|d$ tt|d% tt|d&dtd|d'd(|d) tt|d*dtt|d+dtt|d,dtt|d-dd.}t	j
| tjj|d ||d d/ }|r| jtt|d$ 7  _| jtt|d$ 8  _qt|d ||d tt|d$ tt|d$  tdtdtdtdd0	}	t	j
|	 qt	j
  td1d2d W S  ty }
 z$t	j
  tjd3t|
  tdd3t|
 d d4fW  Y d }
~
S d }
~
ww )6Nsalida1r  r%  r   r&  r   CuentaDebitoCuentaCreditor)  r*  r   MIGRecibe
idproyectofechamodificacionr  opr+  r,  r-  r.  r/  r0  r1  r2  r3  r   rO   FzLa referencia z
 no exister   r   r4  r   r5  r6  rQ   rj  r+   r7  r8  r9  r:  r;  )r4  r%  rO   r   r5  r6  rQ   rh  rj  r7  r8  r9  r:  r;  ri  )	r   r   rO   rz  r   r  rk  r  r  Tu.   Salida guardada y saldo actualizado con éxitozError al guardar la salida: rk   r5   )r   r   r[   get_or_create_mig_userr   r   r=  r'   rU   r   r   r   r   r   r   r\   r   r   r   r   r   rz  r   r   rq   r   rl   rm   rj   )r   salida1_datasalidas2_datanueva_salida1rp  salida2r   nueva_salida2r   rs  rt   r5   r5   r6   guardar_salida  s   


	



$


(r  z /api/salidas_inventario/<numero>c                 C   s   t j}tjj| d }|stddddfS |d |_|d |_t	jj| d
  |d D ]'}t	|  d	|d
  | |d
 |d |d |d |d |d d}tj| q.tj  tdddS )Nr  FzSalida no encontradar   r   r  r)  r  r  rO   r   r5  r6  r  r  r  Tz-Salida de inventario actualizada exitosamente)r   r   r   r\   r   r   r   r  r)  r   r   r   r   r   r   )numeror   salidar  r  r5   r5   r6   actualizar_salida_inventario  s*   



r  c                  C   s:   t jd} | st ddddd} tj|  tj  | S )Nr  temp_pwdzUsuario defaultTr  )r   r\   r[   r   r   r   flush)mig_userr5   r5   r6   r    s   
r  z/api/entradas_informesc                  C   r  )Nu&   Función get_entradas_informes llamadar  r  r  r  rj   r	  r   r  r
  r  r  r  u!   Número de entradas encontradas: )entradastotal_entradasz Error en get_entradas_informes: r  rk   )!rl   rm   rn   r   rZ   r[   r   r   r  r  r  r   r\   r]   r+  r  r_   r   r   r%  r  r*  r   rO   r   r5  r  r6  r3  rp   rq   rj   rU   )r  r  	entradas1rs   e1rf  e2rt   r5   r5   r6   get_entradas_informes)  r  r  z./api/actualizar_consecutivo_salidas_inventarioc               
   C   s   z8t jjdd } | r/t| j}|d7 }|d| _tj  | j	 | j }t
d|dW S t
ddd	d
fW S  tyZ } ztj  t
dt|d	dfW  Y d }~S d }~ww )Nr  rE  rQ  02dTrR  Fu9   No se encontró el consecutivo para Salidas de Inventarior   r   rk   )r   r\   r   r   rT  r  r   r   r   r  r   rq   r   rU   r  r5   r5   r6   )actualizar_consecutivo_salidas_inventarioX  s   



"r  c               
   C   sf  t j} td|   z| d}|stddidfW S td:i d|d| d d	| d
 d| d d| ddd| ddd| ddd| dd| dd| ddd| ddd| dd d!| dd  d"| d#d d$| d%d&| d'd(| d)d*t d+dd,dd-dd.d d/d}td0|j	  t
j| t
j  td1|  td2|d3d4fW S  ty } z+t
j  td5t|  td6|j	  tdd7t| idfW  Y d }~S d }~w ty2 } z,t
j  td8t|  td6t   tdd8t| id9fW  Y d }~S d }~ww );Nrg  r   rj   u$   El código del producto es requeridor   rO   r   r   rh   r   rT   r   r}   r  r   rP   r  rQ   r  rR   r  r~   r  r   r  Buenor   r  Tr   r  Fr   r   r  r{   r   r|   r  rS   r   r*  StockMinimoStockMaximoSaldoAntesInvInsumo	costorealzNueva referencia creada: u,   Referencia creada exitosamente con código: r  )rw   r   r   zError de SQLAlchemy: r  r<  r   rk   r5   )r   r   rl  r  r[   r   r   r   utcnow__dict__r   r   r   r   rn   r"   r   rj   rU   rq   r  r  )r   nuevo_idrw  rt   r5   r5   r6   crear_referencial  s   


	





&
&r  z./api/grupos/<string:id_grupo>/siguiente-codigoc              
   C   s   z6t j| }|stddidfW S |jd u rd|_| jd7  _|  |jd}tj  td|idfW S  ty_ } ztj	  t
d	t|  tdd
idfW  Y d }~S d }~ww )Nrj   r  r   r   rQ  r  nuevoCodigorx   u$   Error al generar siguiente código: u   Error al generar el códigork   )r   r\   r[   r   r^  r   r   r   rq   r   rl  rj   rU   )r  r   nuevo_codigort   r5   r5   r6   obtener_siguiente_codigo  s    


r  __main__)r  )flaskr   r   r   r   r   
flask_corsr   r   
flask_mailr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rl  r0   r2   r  PILr   r    r!   rO  rH  sqlalchemy.excr"   
sqlalchemyr#   r$   werkzeug.securityr%   decimalr'   r(   flask_sqlalchemyr)   uuidsqlalchemy.dialects.postgresqlr*   r7   basicConfigDEBUGINFO	getLogger__name__rm   rl   r  r  app_contextr   r  rn   rt   rj   rU   
create_allrouterL   ra   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r"  rC  rO  rV  r\  r`  rd  rt  rx  r~  r  r  r  r  r  r  r  r  r  r  r  before_requestr  after_requestr  r  r  r  r  r  r  r  r  r  r!  r1  rZ  r[  errorhandlerr]  r^  r_  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  runr5   r5   r5   r6   <module>   s   T










 







$

)









3





5






U


"









J






-


;



	

e




8
3

`


-: