---
name: shopify-tiempo-procesar-devoluciones
description: "Solo lectura: mide el tiempo promedio entre la solicitud de devolución y el reembolso, y muestra los casos que superan tu plazo objetivo (SLA). Úsala cuando quieras saber si estás reembolsando a tiempo y qué devoluciones siguen pendientes."
---

## Propósito
Calcula el tiempo entre la creación de la solicitud de devolución y la emisión del reembolso para todas las devoluciones completadas en un periodo. Muestra el tiempo promedio de procesamiento, identifica los pedidos que superaron un plazo objetivo (SLA) configurable y lista las devoluciones abiertas que llevan más tiempo pendientes. Solo lectura: no ejecuta mutaciones.

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_orders,read_returns`
- Las consultas se ejecutan con `shopify store execute`.
- Permisos (scopes) de API: `read_orders`, `read_returns`

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., tu-tienda.myshopify.com) |
| days_back | integer | no | 30 | Ventana de días hacia atrás de las solicitudes de devolución |
| sla_days | integer | no | 5 | Máximo de días aceptable entre la solicitud y el reembolso |
| format | string | no | human | Formato de salida: `human` o `json` |

## Seguridad

> ℹ️ Skill de solo lectura: no ejecuta mutaciones. Puedes correrla en cualquier momento.

## Pasos

1. **OPERACIÓN:** `returns` — consulta
   **Entradas:** `query: "created_at:>='<NOW - days_back days>'"`, `first: 250`, cursor de paginación
   **Resultado esperado:** Devoluciones con `createdAt`, `status`, `refunds { createdAt }`, `order { name }`

2. Para cada devolución completada: calcula `processing_days = refund.createdAt - return.createdAt`

3. Identifica los incumplimientos del SLA: `processing_days > sla_days`

4. **OPERACIÓN:** `orders` — consulta
   **Entradas:** Filtra los pedidos con `return_status:open` para encontrar devoluciones pendientes que ya superan el SLA
   **Resultado esperado:** Pedidos con devoluciones abiertas y sus fechas de solicitud

## Operaciones GraphQL

```graphql
# returns:query — validada con api_version 2025-01
query ReturnProcessingTimes($query: String!, $after: String) {
  returns(first: 250, after: $after, query: $query) {
    edges {
      node {
        id
        status
        createdAt
        order {
          id
          name
        }
        refunds(first: 3) {
          id
          createdAt
          totalRefundedSet {
            shopMoney {
              amount
              currencyCode
            }
          }
        }
        returnLineItems(first: 10) {
          edges {
            node {
              quantity
              returnReason
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

```graphql
# orders:query — validada con api_version 2025-01
query OrdersWithOpenReturns($query: String!, $after: String) {
  orders(first: 250, after: $after, query: $query) {
    edges {
      node {
        id
        name
        createdAt
        returnStatus
        returns(first: 5) {
          edges {
            node {
              id
              status
              createdAt
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

## Seguimiento de la sesión

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

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Tiempo para procesar devoluciones    ║
║  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>
```

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
TIEMPO DE PROCESAMIENTO DE DEVOLUCIONES  (<days_back> días, SLA: <sla_days> días)
  Devoluciones analizadas:        <n>
  Tiempo promedio de proceso:     <d> días
  Dentro del SLA (<sla_days> d):  <n>  (<pct>%)
  Incumplimientos del SLA:        <n>  (<pct>%)
  Devoluciones abiertas:          <n>

  Devoluciones abiertas más antiguas (aún sin reembolso):
    Pedido <nombre>  — solicitada hace <n> días
  Archivo: return_sla_<fecha>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-tiempo-procesar-devoluciones",
  "store": "<dominio>",
  "period_days": 30,
  "sla_days": 5,
  "returns_analyzed": 0,
  "avg_processing_days": 0,
  "within_sla_count": 0,
  "sla_breach_count": 0,
  "open_pending_count": 0,
  "output_file": "return_sla_<fecha>.csv"
}
```

## Formato de salida
Archivo CSV `return_sla_<AAAA-MM-DD>.csv` con las columnas:
`return_id`, `order_name`, `return_requested_at`, `refunded_at`, `processing_days`, `sla_breach`, `return_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 |
| Devolución completada sin reembolso | Se resolvió solo con un cambio | Exclúyela del cálculo de tiempo y anótala como cambio |
| No hay devoluciones en la ventana | No hubo actividad de devoluciones | Termina con el resumen: 0 devoluciones |

## Buenas prácticas
- Ajusta `sla_days` a lo que promete tu política de devoluciones publicada (p. ej., «reembolsos procesados en 5 días hábiles»).
- Usa la lista de devoluciones abiertas para contactar de forma proactiva a los clientes cuyas devoluciones llevan más de `sla_days` esperando; así reduces las consultas del tipo «¿dónde está mi reembolso?».
- Ejecútala cada semana como chequeo de salud de la operación de devoluciones; combínala con `shopify-motivos-devolucion` para relacionar el procesamiento lento con motivos de devolución específicos.
- Ten en cuenta que `processing_days` mide días calendario; ajusta tu umbral de SLA si tu equipo solo procesa devoluciones en días hábiles.
