---
name: shopify-cambiar-bodega-despacho
description: "Reasigna órdenes de preparación abiertas de una ubicación a otra, por ejemplo cuando una bodega está saturada o cambian tus reglas de despacho por región. Úsala cuando necesites mover muchos pedidos pendientes a otra bodega de una sola vez."
---

## Propósito
Consulta las órdenes de preparación (fulfillment orders) abiertas asignadas a una ubicación de origen y las mueve a una ubicación de destino. Se usa cuando una bodega llegó a su capacidad, cuando una ubicación va a cerrar o cuando cambian las reglas de despacho por región. Reemplaza la reasignación manual en el admin de Shopify: esta skill hace traslados masivos de ubicación para cualquier cantidad de pedidos abiertos en un solo proceso.

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_orders,write_fulfillments`
- Las consultas se ejecutan con `shopify store execute`.
- Permisos (scopes) de API: `read_orders`, `write_fulfillments`
- Tanto la ubicación de origen como la de destino deben ser ubicaciones de preparación de pedidos activas en Shopify

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| source_location_id | string | sí | — | GID de la ubicación DESDE la que se mueven los pedidos |
| destination_location_id | string | sí | — | GID de la ubicación HACIA la que se mueven los pedidos |
| order_filter | string | no | — | Filtro opcional por número de pedido (p. ej., "#1001,#1002") |
| dry_run | bool | no | true | Muestra los movimientos sin ejecutar mutaciones |
| format | string | no | human | Formato de salida: `human` o `json` |

## Seguridad

> ⚠️ `fulfillmentOrderMove` reasigna la responsabilidad de preparar el pedido. Esto cambia qué bodega alista y despacha el pedido. Antes de moverlos, verifica que la ubicación de destino tenga stock suficiente de todos los productos. Ejecuta con `dry_run: true` para confirmar la lista de pedidos y el destino antes de aplicar los cambios.

## Pasos

1. **OPERACIÓN:** `fulfillmentOrders` — consulta
   **Entradas:** `assignedLocationId: <source_location_id>`, `status: OPEN`, `first: 250`, cursor de paginación
   **Resultado esperado:** Lista de órdenes de preparación abiertas; pagina hasta `hasNextPage: false`

2. **OPERACIÓN:** `fulfillmentOrderMove` — mutación
   **Entradas:** `id: <fulfillment_order_id>`, `newLocationId: <destination_location_id>`
   **Resultado esperado:** `movedFulfillmentOrder { id, assignedLocation { name } }`, `userErrors`

## Operaciones GraphQL

```graphql
# fulfillmentOrders:query — validada con api_version 2025-01
query FulfillmentOrdersByLocation($locationId: ID!, $after: String) {
  fulfillmentOrders(
    assignedLocationId: $locationId
    first: 250
    after: $after
    query: "status:open"
  ) {
    edges {
      node {
        id
        status
        order {
          id
          name
        }
        assignedLocation {
          location {
            id
            name
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

```graphql
# fulfillmentOrderMove:mutation — validada con api_version 2025-01
mutation FulfillmentOrderMove($id: ID!, $newLocationId: ID!) {
  fulfillmentOrderMove(id: $id, newLocationId: $newLocationId) {
    movedFulfillmentOrder {
      id
      assignedLocation {
        location {
          id
          name
        }
      }
    }
    originalFulfillmentOrder {
      id
      status
    }
    remainingFulfillmentOrder {
      id
      status
    }
    userErrors {
      field
      message
    }
  }
}
```

## Seguimiento de la sesión

**Claude DEBE mostrar lo siguiente en cada etapa. Es obligatorio.**

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Cambia la bodega que despacha        ║
║  Tienda: <dominio de la tienda>              ║
║  Inicio: <AAAA-MM-DD HH:MM UTC>              ║
╚══════════════════════════════════════════════╝
```

**Después de cada paso**, muestra:
```
[N/TOTAL] <CONSULTA|MUTACIÓN>  <OperationName>
          → Parámetros: <resumen breve de las entradas clave>
          → Resultado: <cantidad o desenlace>
```

Si `dry_run: true`, antepón `[SIMULACIÓN]` a cada paso de mutación y no lo ejecutes.

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
RESUMEN DEL RESULTADO
  Pedidos en la ubicación de origen:  <n>
  Pedidos movidos:                    <n>
  Errores:                            <n>
  Archivo:                            routing_log_<fecha>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-cambiar-bodega-despacho",
  "store": "<dominio>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": true,
  "outcome": {
    "orders_at_source": 0,
    "orders_moved": 0,
    "errors": 0,
    "output_file": "routing_log_<fecha>.csv"
  }
}
```

## Formato de salida
Archivo CSV `routing_log_<AAAA-MM-DD>.csv` con las columnas:
`order_name`, `fulfillment_order_id`, `source_location`, `destination_location`, `status`

## Manejo de errores
| Error | Causa | Solución |
|-------|-------|----------|
| `THROTTLED` | Se superó el límite de solicitudes de la API | Espera 2 segundos y reintenta hasta 3 veces |
| `userErrors` en fulfillmentOrderMove | El pedido ya fue despachado o la ubicación está inactiva | Registra el error, omite el pedido y continúa |
| La ubicación de destino no tiene stock | Inventario insuficiente en el destino | Registra una advertencia por SKU y continúa con el movimiento |
| No hay pedidos abiertos en el origen | El origen no tiene trabajo pendiente | Termina con el resumen: 0 pedidos encontrados |

## Buenas prácticas
- Ejecuta siempre primero con `dry_run: true`: mover una orden de preparación no mueve el inventario; verifica por separado el stock del destino con la skill `shopify-auditoria-inventario-bodegas`.
- Usa `order_filter` para mover primero pedidos puntuales de alta prioridad en lugar de toda la cola.
- Si vas a cerrar una ubicación, ejecuta esta skill antes de desactivarla en el admin de Shopify.
