---
name: shopify-resumen-impuestos
description: "Solo lectura: suma los impuestos cobrados en tus pedidos por jurisdicción o por tarifa para preparar tus declaraciones. Úsala al cierre de cada mes o trimestre, antes de reunirte con tu contador."
---

## Propósito
Suma los impuestos cobrados en todos los pedidos de un período, desglosados por jurisdicción fiscal (estado/provincia, país) y por tarifa de impuesto. Produce un resumen útil para preparar las declaraciones periódicas de impuestos. Solo lectura: no hace mutaciones.

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

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| days_back | integer | no | 90 | Período hacia atrás (usa 30 o 90 para que coincida con tus períodos de declaración) |
| group_by | string | no | jurisdiction | Desglose: `jurisdiction` o `rate` |
| exclude_refunded | bool | no | true | Excluye los impuestos de los pedidos reembolsados por completo |
| format | string | no | human | Formato de salida: `human` o `json` |

## Seguridad

> ℹ️ Skill de solo lectura: no ejecuta mutaciones. Puedes correrla en cualquier momento. Este reporte es solo para preparación interna: consulta con un profesional tributario tus obligaciones reales de declaración.

## Pasos

1. **OPERACIÓN:** `orders` — consulta
   **Entradas:** `query: "financial_status:paid created_at:>='<NOW - days_back days>'"`, `first: 250`, selecciona `taxLines { title, rate, priceSet }`, `refunds { refundLineItems }` y el cursor de paginación
   **Resultado esperado:** Todos los pedidos pagados con sus líneas de impuestos; pagina hasta `hasNextPage: false`

2. Si `exclude_refunded` está activo: resta los impuestos de los pedidos reembolsados por completo

3. Agrupa según `group_by` (título de la jurisdicción o tarifa) y suma `taxLine.priceSet.shopMoney.amount`

## Operaciones GraphQL

```graphql
# orders:query — validada con api_version 2025-01
query TaxLiabilityOrders($query: String!, $after: String) {
  orders(first: 250, after: $after, query: $query) {
    edges {
      node {
        id
        name
        createdAt
        displayFinancialStatus
        totalTaxSet {
          shopMoney {
            amount
            currencyCode
          }
        }
        taxLines {
          title
          rate
          priceSet {
            shopMoney {
              amount
              currencyCode
            }
          }
        }
        shippingAddress {
          countryCode
          provinceCode
        }
        refunds {
          totalRefundedSet {
            shopMoney {
              amount
              currencyCode
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

## Seguimiento de la sesión

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

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Resumen de impuestos cobrados        ║
║  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):
```
══════════════════════════════════════════════
RESUMEN DE IMPUESTOS COBRADOS  (<days_back> días)
  Pedidos analizados:         <n>
  Total de impuestos cobrados: <monto>

  Por jurisdicción:
    CA - California     <monto>  (<n> pedidos)
    NY - New York       <monto>  (<n> pedidos)
  Archivo: tax_liability_<date>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-resumen-impuestos",
  "store": "<dominio>",
  "period_days": 90,
  "orders_analyzed": 0,
  "total_tax_collected": 0,
  "currency": "<moneda de la tienda>",
  "by_jurisdiction": [],
  "output_file": "tax_liability_<date>.csv"
}
```

## Formato de salida
Archivo CSV `tax_liability_<YYYY-MM-DD>.csv` con las columnas:
`jurisdiction`, `country_code`, `province_code`, `tax_rate`, `order_count`, `total_tax_collected`, `currency`

Los montos van en la moneda de la tienda.

## 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 |
| Pedidos sin líneas de impuestos | Impuestos sin configurar o pedidos exentos | Reporta 0 para esos pedidos |
| Pedidos con reembolsos parciales | El crédito de impuestos es difícil de calcular | Márcalos en el resultado; exclúyelos de los totales si `exclude_refunded: true` |

## Buenas prácticas
- Este reporte refleja los impuestos *cobrados* a los clientes: no reemplaza a Shopify Tax ni un análisis profesional de dónde tienes obligación tributaria.
- Ajusta `days_back` a tu período de declaración (30 días si declaras cada mes, 90 si declaras cada trimestre).
- Si vendes en varios estados de EE. UU., verifica que Shopify Tax esté bien configurado en cada estado donde tienes obligación tributaria (nexus) antes de confiar en este resultado.
- El campo `jurisdiction` de `taxLines.title` lo define Shopify Tax y suele incluir el nombre del estado o provincia: verifica que el formato coincida con tu sistema de declaración.
