update_prices.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import psycopg2
  2. from config.settings import POSTGRESQL_DB_CONFIG
  3. from fudo.fudo import get_product, get_products, get_category
  4. from models.items import Product
  5. from rich import print
  6. indexed_products = {}
  7. for x in range(1,6):
  8. products = get_products(x)
  9. for product in products:
  10. indexed_products[str(product["id"])] = product
  11. print(len(indexed_products))
  12. def update_prices():
  13. conn = psycopg2.connect(
  14. dbname=POSTGRESQL_DB_CONFIG['dbname'],
  15. user=POSTGRESQL_DB_CONFIG['user'],
  16. password=POSTGRESQL_DB_CONFIG['password'],
  17. host=POSTGRESQL_DB_CONFIG['host'],
  18. port=POSTGRESQL_DB_CONFIG['port']
  19. )
  20. # Obtengo todos los productos de la base de datos
  21. cursor = conn.cursor()
  22. cursor.execute("SELECT id FROM products")
  23. products = cursor.fetchall()
  24. # Recorro cada producto y actualizo su precio
  25. for product in products:
  26. id = product[0]
  27. print(f"Actualizando el precio de {id}")
  28. f_product = indexed_products.get(str(id))
  29. cursor.execute("UPDATE products SET price = %s WHERE id = %s", (f_product["attributes"]["price"], id))
  30. conn.commit()
  31. print(f"Actualizado el precio de {f_product['attributes']['name']} a {f_product['attributes']['price']}")
  32. def add_missing_products():
  33. """
  34. Verifica qué productos de 'indexed_products' no existen en la DB local
  35. y los inserta respetando los tipos de datos.
  36. """
  37. conn = psycopg2.connect(
  38. dbname=POSTGRESQL_DB_CONFIG['dbname'],
  39. user=POSTGRESQL_DB_CONFIG['user'],
  40. password=POSTGRESQL_DB_CONFIG['password'],
  41. host=POSTGRESQL_DB_CONFIG['host'],
  42. port=POSTGRESQL_DB_CONFIG['port']
  43. )
  44. cursor = conn.cursor()
  45. # 1. Obtenemos solo los IDs que ya existen para no consultar uno por uno (Eficiencia, mi señor)
  46. cursor.execute("SELECT id FROM products")
  47. existing_ids = {row[0] for row in cursor.fetchall()}
  48. products_added = 0
  49. print(f"[bold cyan]Iniciando sincronización de nuevos productos...[/bold cyan]")
  50. for fudo_id_str, product_data in indexed_products.items():
  51. fudo_id = int(fudo_id_str)
  52. # Si el ID no está en nuestra lista de existentes, procedemos a insertar
  53. if fudo_id not in existing_ids and product_data["attributes"]["active"] and product_data["attributes"]["enableQrMenu"]:
  54. attrs = product_data["attributes"]
  55. # --- Mapeo y Limpieza de Datos ---
  56. # Nombre
  57. p_name = attrs.get("name", "Sin Nombre")
  58. # Tipo (Usamos el del JSON root o un default)
  59. p_type = get_category(int(product_data["relationships"]["productCategory"]["data"]["id"]))["name"] or "Producto"
  60. print(f"[yellow]Tipo del producto: {p_type}[/yellow]")
  61. # Descripción (La DB no permite Null, así que enviamos string vacío si no hay)
  62. p_desc = attrs.get("description") or ""
  63. # Precio (La DB es Integer, Fudo es Float. Convertimos a int)
  64. p_price = int(attrs.get("price", 0))
  65. # Imagen
  66. p_image = "https://fudo-apps-storage.s3.sa-east-1.amazonaws.com/production/113378/common/products/"+ fudo_id_str
  67. # Status (Fudo usa booleano, DB usa 1/0. Mapeamos: True->1, False->0)
  68. p_status = 1 if attrs.get("active") else 0
  69. try:
  70. query = """
  71. INSERT INTO products
  72. (id, name, type, description, price, image, status)
  73. VALUES (%s, %s, %s, %s, %s, %s, %s)
  74. """
  75. cursor.execute(query, (
  76. fudo_id,
  77. p_name,
  78. p_type,
  79. p_desc,
  80. p_price,
  81. p_image,
  82. p_status
  83. ))
  84. print(f"[green]Insertado nuevo producto:[/green] {p_name} (ID: {fudo_id})")
  85. products_added += 1
  86. except Exception as e:
  87. print(f"[red]Error al insertar {p_name}:[/red] {e}")
  88. conn.rollback() # Revertimos si falla este específico para no romper el lote
  89. continue
  90. conn.commit()
  91. cursor.close()
  92. conn.close()
  93. print(f"[bold yellow]Proceso finalizado. Se agregaron {products_added} productos nuevos.[/bold yellow]")
  94. if __name__ == "__main__":
  95. # Primero agregamos los que faltan
  96. add_missing_products()
  97. # Luego actualizamos precios (su función original)
  98. update_prices()