import pandas as pd import os import PyLibrary.funciones_comunes as fc from translation_config import TranslationConfig from openpyxl import load_workbook from openpyxl.styles import Font, PatternFill from openpyxl.comments import Comment # Definir el logger a nivel de módulo logger = None def update_from_master(config: TranslationConfig, archivo_to_update): archivo_maestro = config.get_master_path() if not os.path.exists(archivo_maestro): print("El archivo maestro no existe.") return logger.info(" .... ") logger.info( f"Iniciando actualización en {archivo_to_update} desde el archivo maestro. Para {config.codigo_idioma_seleccionado}" ) df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro) df_to_update = fc.read_dataframe_with_cleanup_retries(archivo_to_update) col_clave = config.codigo_columna_maestra celdas_con_errores = {} celdas_vacias = {} progress_bar = fc.ProgressBar( len(df_to_update), prefix="Actualizando filas:", suffix="Completado" ) for index, fila in df_to_update.iterrows(): valor_original = fila[col_clave] clave = fc.compactar_celda_clave(config.codigo_tipo_PLC, valor_original) if not pd.isna(clave) and clave in df_maestro[col_clave].values: # logger.info(f"Fila {index} : Clave: {clave}") indice_maestro = df_maestro.index[df_maestro[col_clave] == clave].tolist()[ 0 ] valor_traducido_compacto = df_maestro.loc[ indice_maestro, config.codigo_idioma_seleccionado ] if pd.isna(valor_traducido_compacto): celdas_vacias[indice_maestro] = "Celda vacía en el archivo maestro" logger.info(f"Fila {index}: Celda vacía en el archivo maestro") else: valor_traducido = fc.decompactar_celda_traducida( config.codigo_tipo_PLC, celda_original=valor_original, celda_traducida=valor_traducido_compacto, ) if ( not pd.isna(valor_traducido) and fila[config.codigo_idioma_seleccionado] != valor_traducido ): okToSave, Error = fc.verificar_celda_traducida( config.codigo_tipo_PLC, clave, valor_traducido_compacto ) if okToSave: logger.info(f"Actualizado: Fila {index} : Clave: {clave}") df_to_update.at[index, config.codigo_idioma_seleccionado] = ( valor_traducido ) else: df_to_update.at[index, config.codigo_idioma_seleccionado] = ( valor_original ) logger.error(f"No actualizado porque: {Error}") celdas_con_errores[indice_maestro] = Error progress_bar.increment() progress_bar.finish() nombre, extension = os.path.splitext(archivo_to_update) nuevo_nombre = f"{nombre}_import{extension}" fc.save_dataframe_with_retries(df_to_update, output_path=nuevo_nombre) marcar_celdas_con_errores( archivo_maestro, celdas_con_errores, celdas_vacias, config.codigo_idioma_seleccionado, ) print( f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro." ) print( f"Se han marcado {len(celdas_con_errores)} celdas con errores en el archivo maestro." ) print(f"Se han marcado {len(celdas_vacias)} celdas vacías en el archivo maestro.") logger.info(" .... ") def marcar_celdas_con_errores(archivo_maestro, celdas_con_errores, celdas_vacias, target_lang_code): workbook = load_workbook(archivo_maestro) sheet = workbook.active for col in range(1, sheet.max_column + 1): if sheet.cell(row=1, column=col).value == target_lang_code: target_col = col break else: print(f"No se encontró la columna para el idioma {target_lang_code}") return error_fill = PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid") empty_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") white_font = Font(color="FFFFFF") # Fuente blanca para celdas con fondo rojo for indice_maestro, mensaje_error in celdas_con_errores.items(): row = indice_maestro + 2 cell = sheet.cell(row=row, column=target_col) cell.fill = error_fill cell.font = white_font # Aplicar fuente blanca comment = Comment(mensaje_error, "Sistema de Traducción") cell.comment = comment for indice_maestro, mensaje in celdas_vacias.items(): row = indice_maestro + 2 cell = sheet.cell(row=row, column=target_col) cell.fill = empty_fill comment = Comment(mensaje, "Sistema de Traducción") cell.comment = comment workbook.save(archivo_maestro) print(f"Se han marcado las celdas con errores y vacías en el archivo maestro {archivo_maestro}") def run(config: TranslationConfig, archivo_to_update): global logger logger = fc.configurar_logger(config.work_dir) script_name = os.path.basename(__file__) print(f"\rIniciando: {script_name}\r") update_from_master(config, archivo_to_update) if __name__ == "__main__": import menu_pasos_traduccion menu_pasos_traduccion.main()