From af82b028d8e78e29b62d0b8b6fd99b0c852c8e6a Mon Sep 17 00:00:00 2001 From: consultoria-as Date: Thu, 25 Jun 2026 23:45:30 +0000 Subject: [PATCH] feat: importa stock positivo del respaldo PZ a tenant La Casita --- scripts/import_pz_stock_la_casita.py | 97 ++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 scripts/import_pz_stock_la_casita.py diff --git a/scripts/import_pz_stock_la_casita.py b/scripts/import_pz_stock_la_casita.py new file mode 100644 index 0000000..1661f49 --- /dev/null +++ b/scripts/import_pz_stock_la_casita.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +""" +Importa solo el stock positivo del respaldo Punto Zero (datos1.productos.Existencia) +al tenant de La Casita. Usa part_number como llave de cruce. + +Requiere pymysql y psycopg2. Instalar con: + pip3 install --target /tmp/pylibs pymysql psycopg2-binary +""" +import os +import sys + +sys.path.insert(0, "/tmp/pylibs") + +import pymysql +import psycopg2 + +MYSQL_HOST = os.getenv("MYSQL_HOST", "127.0.0.1") +MYSQL_PORT = int(os.getenv("MYSQL_PORT", "3307")) +MYSQL_DB = os.getenv("MYSQL_DB", "datos1") +MYSQL_USER = os.getenv("MYSQL_USER", "root") +MYSQL_PASS = os.getenv("MYSQL_PASS", "") + +PG_URL = os.getenv( + "TENANT_DB_URL", + "postgresql://postgres@localhost/tenant_refaccionaria_la_casita", +) +BRANCH_ID = int(os.getenv("BRANCH_ID", "1")) + + +def main(): + mysql = pymysql.connect( + host=MYSQL_HOST, + port=MYSQL_PORT, + user=MYSQL_USER, + password=MYSQL_PASS, + db=MYSQL_DB, + charset="latin1", + ) + pg = psycopg2.connect(PG_URL) + + mycur = mysql.cursor() + mycur.execute("SELECT Clave, Existencia FROM productos WHERE Existencia > 0") + rows = mycur.fetchall() + + pgcur = pg.cursor() + inserted = 0 + updated = 0 + skipped = 0 + for clave, existencia in rows: + sku = str(clave).strip() if clave else "" + if not sku: + skipped += 1 + continue + stock = int(round(float(existencia))) + if stock <= 0: + continue + + # Buscar inventory_id por part_number + pgcur.execute( + "SELECT id FROM inventory WHERE part_number = %s LIMIT 1", + (sku,), + ) + inv_row = pgcur.fetchone() + if not inv_row: + skipped += 1 + continue + inventory_id = inv_row[0] + + pgcur.execute( + """ + INSERT INTO inventory_stock (inventory_id, branch_id, stock, location) + VALUES (%s, %s, %s, NULL) + ON CONFLICT (inventory_id, branch_id) DO UPDATE + SET stock = EXCLUDED.stock, + updated_at = NOW() + """, + (inventory_id, BRANCH_ID, stock), + ) + if pgcur.rowcount == 1: + # psycopg2 rowcount for INSERT ... ON CONFLICT is tricky + inserted += 1 + else: + updated += 1 + + pg.commit() + pgcur.close() + mycur.close() + mysql.close() + pg.close() + + print(f"Productos con stock en respaldo: {len(rows)}") + print(f"Filas insertadas/actualizadas en inventory_stock: {inserted + updated}") + print(f"Sin coincidencia de part_number o SKU vacĂ­o: {skipped}") + + +if __name__ == "__main__": + main()