update_prices.py 4.5 KB

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