Este es un ejemplo de cómo sincronizar una base de datos local con woocommerce:
Subida: productos, precios, estatus de pedidos
Bajada: Pedidos
import pyodbc
from woocommerce import API
# --- CONFIGURACIÓN DE CONEXIÓN ---
wcapi = API(
url="https://tu-tienda.com",
consumer_key="ck_xxxx",
consumer_secret="cs_xxxx",
version="wc/v3",
timeout=120
)
# Conexión a SQL Server 2012
conn_str = "Driver={SQL Server};Server=localhost\MYBUSINESSPOS;Database=v8_demo;Trusted_Connection=yes;"
def ejecutar_sincronizacion_batch():
try:
db = pyodbc.connect(conn_str)
cursor = db.cursor()
# --- 1. ACTUALIZAR STOCK (PRODS -> WEB) ---
# Solo productos vinculados (wc_id no nulo)
cursor.execute("SELECT wc_id, existencia, articulo FROM prods WHERE wc_id IS NOT NULL")
productos = cursor.fetchall()
if productos:
for i in range(0, len(productos), 100):
lote = productos[i:i+100]
# Formato Batch para WooCommerce
items_stock = [
{
"id": p.wc_id,
"manage_stock": True,
"stock_quantity": int(p.existencia) if p.existencia >= 0 else 0
} for p in lote
]
payload = {"update": items_stock}
wcapi.post("products/batch", payload)
print(f"Inventario: Procesados {len(lote)} artículos.")
# --- 2. ACTUALIZAR ESTATUS (PEDIDOS CO -> COMPLETED) ---
# Buscamos ventas que ya pasaron de PE a CO
cursor.execute("SELECT wc_order_id, Venta FROM pedidos WHERE wc_order_id IS NOT NULL AND estatus = 'CO'")
ventas_finalizadas = cursor.fetchall()
if ventas_finalizadas:
for i in range(0, len(ventas_finalizadas), 100):
lote_v = ventas_finalizadas[i:i+100]
batch_orders = {
"update": [{"id": v.wc_order_id, "status": "completed"} for v in lote_v]
}
wcapi.post("orders/batch", batch_orders)
# Opcional: Limpiar wc_order_id o marcar como sincronizado en SQL
# para evitar procesarlos en la siguiente vuelta
for v in lote_v:
cursor.execute("UPDATE pedidos SET wc_order_id = NULL WHERE Venta = ?", (v.Venta,))
db.commit()
print(f"Estatus: {len(ventas_finalizadas)} órdenes marcadas como completadas.")
except Exception as e:
print(f"Error en sincronización: {e}")
finally:
if 'db' in locals(): db.close()
if __name__ == "__main__":
ejecutar_sincronizacion_batch()






