Publicado el Dejar un comentario

Sincronizar el POS y WooCommerce con Python

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()
Continúa leyendo Sincronizar el POS y WooCommerce con Python