{
  "info": {
    "name": "Finanxis Business API (ES)",
    "description": "1. Abre la colección → Variables y pon tu `key` (pk_test_…) y `secret` (sk_test_…).\n2. Corre **Probar la integración**.\n3. Crea un cobro: su id queda guardado en `cobro_id` para consultar o cancelar.\n\nLa firma HMAC se calcula sola en el script pre-request. Guía: https://business.finanxis.net/docs/es",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://sandbox.finanxis.net/business/v0"
    },
    {
      "key": "key",
      "value": "pk_test_..."
    },
    {
      "key": "secret",
      "value": "sk_test_..."
    },
    {
      "key": "cobro_id",
      "value": ""
    }
  ],
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "const secret = pm.variables.get(\"secret\");",
          "if (!secret || secret.startsWith(\"sk_test_...\")) throw new Error(\"Configura la variable 'secret' de la colección / Set the collection 'secret' variable\");",
          "const ts = Math.floor(Date.now() / 1000).toString();",
          "const method = pm.request.method.toUpperCase();",
          "const full = pm.variables.replaceIn(pm.request.url.toString());",
          "const pathQuery = full.replace(/^https?:\\/\\/[^/]+/, \"\");",
          "const body = method === \"GET\" || method === \"DELETE\" ? \"\" : pm.variables.replaceIn((pm.request.body && pm.request.body.raw) || \"\");",
          "const firma = CryptoJS.HmacSHA256(ts + \".\" + method + \".\" + pathQuery + \".\" + body, secret).toString(CryptoJS.enc.Hex);",
          "pm.request.headers.upsert({ key: \"X-Finanxis-Key\", value: pm.variables.get(\"key\") });",
          "pm.request.headers.upsert({ key: \"X-Finanxis-Timestamp\", value: ts });",
          "pm.request.headers.upsert({ key: \"X-Finanxis-Signature\", value: firma });"
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "const r = pm.response.json();",
          "pm.test(\"success\", () => pm.expect(r.success, r.data && r.data.error ? r.data.error.code + \": \" + r.data.error.como_resolver : \"\").to.be.true);",
          "if (r.success && r.data && typeof r.data.id === \"string\" && r.data.id.length) pm.collectionVariables.set(\"cobro_id\", r.data.id);"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "Integración",
      "item": [
        {
          "name": "Probar la integración",
          "request": {
            "method": "GET",
            "description": "Si responde `success: true`, tu llave y tu firma están bien configuradas. Úsalo como primer paso.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/ping",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "ping"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Cobros",
      "item": [
        {
          "name": "Crear un cobro",
          "request": {
            "method": "POST",
            "description": "Crea el cobro que mostrará el QR de la caja (`caja_id` del dashboard). Si la caja ya tiene un cobro pendiente, responde `CONFLICTO_ESTADO`: cancélalo o espera a que venza. Reintentar con la misma `Idempotency-Key` devuelve el mismo cobro (200 con header `Idempotent-Replayed: true`).",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "Único por operación (usa tu número de ticket)."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/cobros",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cobros"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"caja_id\": \"caja_8x2k1m\",\n  \"monto\": 21000.5,\n  \"moneda\": \"VES\",\n  \"referencia_externa\": \"TICKET-55821\",\n  \"expira_en_segundos\": 180\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Listar cobros",
          "request": {
            "method": "GET",
            "description": "Ordenados del más reciente al más antiguo. Pagina con `cursor`.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/cobros",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cobros"
              ],
              "query": [
                {
                  "key": "estado",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "caja_id",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "desde",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "hasta",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limite",
                  "value": "20",
                  "disabled": false
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Consultar un cobro",
          "request": {
            "method": "GET",
            "description": "Úsalo si no recibiste el webhook o para confirmar el estado antes de entregar la compra.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/cobros/{{cobro_id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cobros",
                "{{cobro_id}}"
              ]
            }
          }
        },
        {
          "name": "Cancelar un cobro",
          "request": {
            "method": "POST",
            "description": "Solo cobros `PENDIENTE`. Un cobro pagado o vencido no se puede cancelar; cancelarlo dos veces no es error.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/cobros/{{cobro_id}}/cancelar",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cobros",
                "{{cobro_id}}",
                "cancelar"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Pagos",
      "item": [
        {
          "name": "Listar pagos recibidos",
          "request": {
            "method": "GET",
            "description": "Cobros pagados, del más reciente al más antiguo. Incluye la moneda con que pagó el cliente, la comisión y el monto neto.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/pagos",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "pagos"
              ],
              "query": [
                {
                  "key": "caja_id",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "sucursal_id",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "desde",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "hasta",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limite",
                  "value": "20",
                  "disabled": false
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Sucursales y cajas",
      "item": [
        {
          "name": "Listar sucursales",
          "request": {
            "method": "GET",
            "description": "Tus sucursales con la cantidad de cajas de cada una.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/sucursales",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "sucursales"
              ],
              "query": [
                {
                  "key": "activa",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limite",
                  "value": "20",
                  "disabled": false
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Consultar una sucursal",
          "request": {
            "method": "GET",
            "description": "La sucursal con todas sus cajas.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/sucursales/{{cobro_id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "sucursales",
                "{{cobro_id}}"
              ]
            }
          }
        },
        {
          "name": "Listar cajas",
          "request": {
            "method": "GET",
            "description": "Todas tus cajas con su QR fijo. Filtra por sucursal o estado.",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/cajas",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cajas"
              ],
              "query": [
                {
                  "key": "sucursal_id",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "activa",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limite",
                  "value": "20",
                  "disabled": false
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true
                }
              ]
            }
          }
        },
        {
          "name": "Consultar una caja",
          "request": {
            "method": "GET",
            "description": "La caja, su sucursal y el id de su cobro pendiente (si tiene uno).",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/cajas/{{cobro_id}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "cajas",
                "{{cobro_id}}"
              ]
            }
          }
        }
      ]
    }
  ]
}