import os import shutil # ======================================================================== def tiene_datos_parciales(m): """True si el archivo tiene al menos un campo útil, aunque incompleto.""" if m['ruc'] not in ("N/A", "Desconocido"): return True if m['serie_numero'] not in ("No encontrado", "N/A"): return True if m['tipo'] != "99": return True return False # ======================================================================== def renombrar_archivos_por_metadata(metadatos, ruta_base): """ Renombra cada archivo según su propia metadata extraída. - XML/PDF con archivo_propuesto válido: se renombra a {archivo_propuesto}{extension} - CDR (tipo 'CDR'): se renombra igual (archivo_propuesto ya incluye CDR) - Sin metadata válida (archivo_propuesto is None): se deja intacto (será eliminado al limpiar) Retorna la lista de metadatos actualizada con los nombres finales. """ for m in metadatos: nombre_original = m['archivo'] extension = m['extension'] propuesto = m.get('archivo_propuesto') if propuesto is None: continue nuevo_nombre = f"{propuesto}{extension}" if nuevo_nombre == nombre_original: continue ruta_old = os.path.join(ruta_base, nombre_original) ruta_new = os.path.join(ruta_base, nuevo_nombre) try: if os.path.exists(ruta_old): if os.path.exists(ruta_new) and ruta_old != ruta_new: os.remove(ruta_new) os.rename(ruta_old, ruta_new) m['archivo'] = nuevo_nombre except Exception as e: print(f" ⚠️ Error renombrando '{nombre_original}': {e}") return metadatos # ======================================================================== def mover_validos_a_resultado(metadatos, ruta_origen, ruta_destino): """ Mueve solo los archivos que tienen metadata válida (archivo_propuesto no None) desde la carpeta de descarga a la carpeta de resultados. """ if not os.path.exists(ruta_destino): os.makedirs(ruta_destino) movidos = 0 for m in metadatos: if m.get('archivo_propuesto') is None: continue archivo = m['archivo'] ruta_old = os.path.join(ruta_origen, archivo) ruta_new = os.path.join(ruta_destino, archivo) try: if os.path.exists(ruta_old): if os.path.exists(ruta_new) and ruta_old != ruta_new: os.remove(ruta_new) os.rename(ruta_old, ruta_new) movidos += 1 except Exception as e: print(f" ⚠️ Error trasladando '{archivo}' a resultado: {e}") if movidos: print(f" 📦 {movidos} archivo(s) movido(s) a resultado.") # ======================================================================== def mover_a_evaluar(metadatos, ruta_origen, ruta_evaluar): """ Mueve archivos con metadata parcial a la carpeta evaluar/ para revisión. Conserva el nombre original del archivo (sin renombrar). """ if not metadatos: return if not os.path.exists(ruta_evaluar): os.makedirs(ruta_evaluar) movidos = 0 for m in metadatos: archivo = m['archivo'] ruta_old = os.path.join(ruta_origen, archivo) ruta_new = os.path.join(ruta_evaluar, archivo) try: if os.path.exists(ruta_old): if os.path.exists(ruta_new) and ruta_old != ruta_new: os.remove(ruta_new) os.rename(ruta_old, ruta_new) movidos += 1 except Exception as e: print(f" ⚠️ Error moviendo '{archivo}' a evaluar: {e}") if movidos: print(f" 🔍 {movidos} archivo(s) movido(s) a evaluar (metadata parcial).") # ======================================================================== def limpiar_carpeta_descarga(ruta): """ Elimina todos los archivos y subcarpetas dentro de la carpeta de descarga. Omite la subcarpeta 'evaluar/' para no borrar archivos pendientes de revisión. """ if not os.path.exists(ruta): return print(f" 🧹 Limpiando carpeta de descarga") for archivo in os.listdir(ruta): if archivo == "evaluar": continue ruta_archivo = os.path.join(ruta, archivo) try: if os.path.isfile(ruta_archivo): os.remove(ruta_archivo) elif os.path.isdir(ruta_archivo): shutil.rmtree(ruta_archivo) except Exception as e: print(f" ⚠️ No se pudo eliminar '{archivo}': {e}") # ========================================================================