#deploy import psycopg2 from config.settings import POSTGRESQL_DB_CONFIG from fudo.fudo import get_product, get_products, get_category, get_all_products from models.items import Product from rich import print indexed_products = {} # for x in range(1,6): # products = get_products(x) # for product in products: # indexed_products[str(product["id"])] = product # print(len(indexed_products)) def update_prices(): conn = psycopg2.connect( dbname=POSTGRESQL_DB_CONFIG['dbname'], user=POSTGRESQL_DB_CONFIG['user'], password=POSTGRESQL_DB_CONFIG['password'], host=POSTGRESQL_DB_CONFIG['host'], port=POSTGRESQL_DB_CONFIG['port'] ) # Obtengo todos los productos de la base de datos cursor = conn.cursor() cursor.execute("SELECT id FROM products") products = cursor.fetchall() # Recorro cada producto y actualizo su precio for product in products: id = product[0] print(f"Actualizando el precio de {id}") f_product = indexed_products.get(str(id)) cursor.execute("UPDATE products SET price = %s WHERE id = %s", (f_product["attributes"]["price"], id)) conn.commit() print(f"Actualizado el precio de {f_product['attributes']['name']} a {f_product['attributes']['price']}") def add_missing_products(): """ Verifica qué productos de 'indexed_products' no existen en la DB local y los inserta respetando los tipos de datos. """ conn = psycopg2.connect( dbname=POSTGRESQL_DB_CONFIG['dbname'], user=POSTGRESQL_DB_CONFIG['user'], password=POSTGRESQL_DB_CONFIG['password'], host=POSTGRESQL_DB_CONFIG['host'], port=POSTGRESQL_DB_CONFIG['port'] ) cursor = conn.cursor() # 1. Obtenemos solo los IDs que ya existen para no consultar uno por uno (Eficiencia, mi señor) cursor.execute("SELECT id FROM products") existing_ids = {row[0] for row in cursor.fetchall()} products_added = 0 print(f"[bold cyan]Iniciando sincronización de nuevos productos...[/bold cyan]") for fudo_id_str, product_data in indexed_products.items(): fudo_id = int(fudo_id_str) # Si el ID no está en nuestra lista de existentes, procedemos a insertar if fudo_id not in existing_ids and product_data["attributes"]["active"] and product_data["attributes"]["enableQrMenu"]: attrs = product_data["attributes"] # --- Mapeo y Limpieza de Datos --- # Nombre p_name = attrs.get("name", "Sin Nombre") # Tipo (Usamos el del JSON root o un default) p_type = get_category(int(product_data["relationships"]["productCategory"]["data"]["id"]))["name"] or "Producto" print(f"[yellow]Tipo del producto: {p_type}[/yellow]") # Descripción (La DB no permite Null, así que enviamos string vacío si no hay) p_desc = attrs.get("description") or "" # Precio (La DB es Integer, Fudo es Float. Convertimos a int) p_price = int(attrs.get("price", 0)) # Imagen p_image = "https://fudo-apps-storage.s3.sa-east-1.amazonaws.com/production/113378/common/products/"+ fudo_id_str # Status (Fudo usa booleano, DB usa 1/0. Mapeamos: True->1, False->0) p_status = 1 if attrs.get("active") else 0 try: query = """ INSERT INTO products (id, name, type, description, price, image, status) VALUES (%s, %s, %s, %s, %s, %s, %s) """ cursor.execute(query, ( fudo_id, p_name, p_type, p_desc, p_price, p_image, p_status )) print(f"[green]Insertado nuevo producto:[/green] {p_name} (ID: {fudo_id})") products_added += 1 except Exception as e: print(f"[red]Error al insertar {p_name}:[/red] {e}") conn.rollback() # Revertimos si falla este específico para no romper el lote continue conn.commit() cursor.close() conn.close() print(f"[bold yellow]Proceso finalizado. Se agregaron {products_added} productos nuevos.[/bold yellow]") if __name__ == "__main__": # Primero agregamos los que faltan # add_missing_products() # Luego actualizamos precios (su función original) # update_prices() products = get_all_products() for product in products: indexed_products[str(product["id"])] = product