+
    i1                         ^ RI t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	 ^ RI
t
^ RIHt ^ RIHt ]! 4        RtR tR tRR]RR3R	 ltR# )
    N)secure_filename)	send_fileabortredirect)Config)load_dotenvzhttps://file.sycelephant.comc           	      @    V '       g   R RRR/# V P                   P                  4       P                  R4      '       g   R RRR/# \        VP	                  RR4       R24      p\
        P                  ! 4       p\        P                  P                  WT4      pV P                  V4       \        P                  ! R4      p\        P                  ! R	4      p\        P                  ! R
4      p	\        P                  ! V4      p
V
P                  W4       V
P                  V4       \!        VR4      ;_uu_ 4       pV
P#                  RV 2V4       RRR4       V
P%                  4        \&         V V 2p\        P(                  ! V4       R RRRV RV RV 2RVRV/#   + '       g   i     LU; i  \*         dg   pR\-        4       9   d<   \        P                  P/                  X4      '       d   \        P(                  ! T4       R RRR\1        T4       2/u Rp?# Rp?ii ; i)exitoFmensajeu"   No se proporcionó ningún archivo.pdfzSolo se permiten archivos PDF _FTP_HOSTFTP_USERFTP_PASSrbzSTOR NTz	Archivo 'z' subido exitosamente a /nombre_archivourl_webruta_archivo_tempzError al subir el archivo: )filenamelowerendswithr   replacetempfile
gettempdirospathjoinsavegetenvftplibFTPlogincwdopen
storbinaryquitBASE_URLremove	Exceptionlocalsexistsstr)technicalSheetitemcarpeta_destinocarpetar   temp_dirr   host_ftpusuario_ftp   contraseña_ftpconexion_ftparchivourl_archivoes   &&&&          PC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Subir_Archivo.pysubir_archivo_ftp_desde_requestr<      s   6SUI/STT &&,,.77??UI/NOO )DLLc,B+C4)HI &&(GGLLB-. 99Z(ii
+))J/zz(+;8 	) #T**g##eN+;$<gF +
 	 "
7)N+;< 			#$ T>"22J8*TUVeUfgn{	
 	
 +*(  S&(*rww~~>O/P/PII'(	-HQ+QRRSsR   F, F, .F, F, C1F, 6FAF, F)	$F, ,H73H+'HHHc                    V P                  R4      '       d   T pVP                  R4      R,          pMT p\         RV 2p\        P                  P                  \        P                  ! 4       V4      p\        P                  ! VRR7      pVP                  ^8X  dW   \        VR4      ;_uu_ 4       pVP                  RR7       F  pVP                  V4       K  	  R	R	R	4       \        VR
RVR7      # \        V4      #   + '       g   i     L*; i  \          dO   p\#        RT  RT 24       T P                  R4      '       d   \        T 4      u R	p?# \%        R4        R	p?R	# R	p?ii ; i)u   
Visualiza un archivo PDF específico desde el servidor remoto.

Args:
    filename_or_url: Nombre del archivo PDF o URL completa
    
Returns:
    Flask response: Envía el archivo para visualización o redirecciona a su URL
httpr   z//static/pdf/Ventas/EUA/DMITEMS/BREAKER_CATALOG/T)streamwbi    )
chunk_sizeNzapplication/pdfF)mimetypeas_attachmentdownload_namezError al visualizar el PDF z: i  )
startswithsplitr)   r   r   r   r   r   requestsgetstatus_coder&   iter_contentwriter   r   r+   printr   )filename_or_urlurlr   temp_file_pathresponsefchunkr:   s   &       r;   view_pdf_filerT   V   s=   ( %%f--!Cyy~b)H 'HJMhZXC h&9&9&;XF <<D13&nd++q%22d2CEGGEN D ,
 *#&	  C=  ,+  +O+<BqcBC%%f--O,,#JJsG   D BD 1+C>D 3
D >D		D E*2E%E*E%%E*c                    Vf[   Vf   Rp ^ RI p\        RV 24       VP                  V4      p\        W4      p\        RVP                   RVP                   24       \        R
V  24       \        RV 24       V! 4       p\        R\        V4       24       V'       g   RRR	RV  R2/# \        R\        V4      ^8  d
   VR,          MT 24       V	'       d1   \        P                  P                  WI4      P                  RR4      pMTp\        RV 24       \        P                  ! R4      p\        P                  ! R4      p\        P                  ! R4      p \        RV 24       \        P                  ! V4      pVP!                  VV4        VP#                  V4       VP%                  4       p\        R\        V4       24       \        R\        V4      ^8  d
   VR,          MT 24       ^ p^ pT EF	  pTP)                  TR4      pTP)                  T4      pT'       g   \        RT 24       K?  TP                  R R!4       R"2p\        R#T 24       TT9   dd   \        R$T 24       T
pT T RT 2p\        R%T 24       \        R&T 24       TT8w  d&   \        R'T R(T 24       T! TT4       T^,          pK  K  \        R)T 24       Tf   K  TR8w  g   K  \        R*T 24       T! TR4       T^,          pEK  	  TP+                  4        RR+R	R,T R-T 2R.TR/T/#   \
        \        3 d4   p\        R\        T4       24       RRR	R\        T4       2/u Rp?# Rp?ii ; i  \        P&                   d,   p\        R\        T4       24       RRR	RT R2/u Rp?# Rp?ii ; i  \,         d4   p\        R0\        T4       24       RRR	R0\        T4       2/u Rp?# Rp?ii ; i  \,         dQ   p\        R1\        T4       24       ^ RIp \        T P1                  4       4       RRR	R2\        T4       2/u Rp?# Rp?ii ; i)3u  
Verifica la existencia de archivos en el servidor FTP y actualiza una tabla con las URLs.

Args:
    tabla: Nombre de la tabla en la base de datos a consultar
    campo_id: Nombre del campo que contiene el identificador del registro
    campo_url: Nombre del campo que contiene la URL del archivo
    update_function: Función para actualizar el registro en la base de datos
    ruta_remota: Ruta en el servidor donde se buscarán los archivos
    search_function: Función para obtener los items (si es None, se importará dinámicamente)
    module_path: Ruta al módulo donde se encuentra la función de búsqueda
    search_function_name: Nombre de la función a importar del módulo (por defecto "searchitems")
    base_url: URL base para construir las URLs web (por defecto usa BASE_URL global)
    subfolder: Subcarpeta específica dentro de ruta_remota (opcional)
    
Returns:
    dict: Diccionario con resultado de la operación
NzDConsultas_SQL.Ventas.VentasEUA.DataMaster.DMBreakerProtectionTypeSQLu!   Importando dinámicamente desde: u   Función importada: z desde u(   Error importando función de búsqueda: r
   Fr   u-   Iniciando verificación de archivos en tabla zRuta remota: zItems encontrados: z$No se encontraron datos en la tabla .zMuestra de items: :N   N\r   zRuta completa: r   r   r   zConectando a z"Archivos encontrados en servidor: zPrimeros 5 archivos: :N   Nz(Error de permisos al listar directorio: zEl directorio z, no existe en el servidor o no hay permisos. u   Item sin ID válido: r   r   r   zVerificando archivo: z Archivo encontrado en servidor: zURL construida: zURL actual: zActualizando z
 con URL: z#Archivo NO encontrado en servidor: zLimpiando URL para Tu(   Verificación completada. Actualizados: z, No encontrados: actualizadosno_encontradosu   Error de conexión FTP: zError general: zError: )	importlibrM   import_modulegetattr__name__ImportErrorAttributeErrorr.   lenr   r   r   r   r!   r"   r#   r$   r%   nlst
error_permrI   r(   r+   	traceback
format_exc)!tablacampo_id	campo_urlupdate_functionruta_remotasearch_function_namesearch_functionmodule_pathbase_url	subfolderr2   r]   moduleimport_erroritemsruta_completar4   r5   r6   ftparchivos_remotos
perm_errorr[   r\   r0   item_iditem_urlr   path_weburl_completa	ftp_errorr:   rf   s!   &&&&&&&&&&&                      r;   verificar_actualizar_archivosr~      s   &~?""ds 9+GH"00= #*&"G,_-E-E,FgfooM^_` 	=eWEFk]+,  !#CJ<01UI1UV[U\\]/^__ 	"E
a59U"KLM GGLL@HHsSM'M/0 99Z(ii
+))J/I	\M(,-**X&CIIk?3A&#&88: :3?O;P:QRS-cJZF[_`F`.>r.Bfv-wxy
 LN ((8R088I.1$89 %,OOC$=#>d!C-n-=>? "%55<^<LMN
  'H&.Zz>:J#KL,\N;<L
34  </gYjOP'>$) 0
 ??OPQ  +B 3G9=>'6&!+M R HHJ El^Sefteuv .	   0 s@\AR@STU	5]^abn^o]p3qrrsX $$ A@Z@QRS	^M?R~3  A  AAt  	\,S^,<=>UI1I#i.IY/Z[[	\  ?Ax()i""$%	WSVH+=>>	?s   
O3 AL(  AO3 ,.O3 BO3 6N2 AM/ 4C!N2 N2 #AN2 (M,9(M'!M,"O3 'M,,O3 /N/ N*$N/%N2 *N//N2 2O0=(O+%O0&O3 +O00O3 3Q>AQ	Q	Q)r   werkzeug.utilsr   ior"   r   flaskr   r   r   rH   configr   dotenvr   r)   r<   rT   r~        r;   <module>r      sg    
 * 	   , ,     *7Sx2n CG  UY  dl  x|  EI Q?r   