| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #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
|