{
  "info": {
    "name": "SPIDI · API Productos (simulador)",
    "description": "Flujo verificado contra el simulador hosteado de SPIDI: registro, acuerdo, sesion de Boton, forzar desenlace (plano de control) y consultar estado. Ajusta la variable base_url para tu entorno.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://sim-productos.example"
    },
    {
      "key": "token",
      "value": ""
    },
    {
      "key": "console_token",
      "value": ""
    },
    {
      "key": "agreement_id",
      "value": ""
    },
    {
      "key": "session_id",
      "value": ""
    },
    {
      "key": "bank_account_id",
      "value": "11111111-1111-1111-1111-111111111111"
    }
  ],
  "item": [
    {
      "name": "0 · Alta de cuenta de prueba",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "// El alta devuelve TRES piezas y cada una sirve para algo distinto:",
              "//   key.token         → el Bearer del API (lo que usan los pasos 1 y 2)",
              "//   console_token     → el de la consola y sus receptores de webhook",
              "//   key.short_name/password → las credenciales de POST /api/spidipagos/login",
              "const b = pm.response.json();",
              "pm.test('201', () => pm.response.to.have.status(201));",
              "pm.test('devuelve las tres piezas', () => {",
              "  pm.expect(b.key.token, 'key.token').to.be.a('string');",
              "  pm.expect(b.console_token, 'console_token').to.be.a('string');",
              "  pm.expect(b.key.short_name, 'key.short_name').to.be.a('string');",
              "});",
              "pm.collectionVariables.set('token', b.key.token);",
              "pm.collectionVariables.set('console_token', b.console_token);"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/console/register",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "console",
            "register"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"email\": \"{{$guid}}@ejemplo.test\",\n  \"password\": \"prueba-2026\"\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      }
    },
    {
      "name": "1 · Crear acuerdo de pago",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "// `default_bank_account_id` es OBLIGATORIO y el API no lo dice hasta que falla.",
              "// En producción sale de registrar y validar una cuenta en SPIDI Center; aquí vale",
              "// cualquier UUID porque es el simulador.",
              "const b = pm.response.json();",
              "pm.test('200 y el acuerdo creado', () => {",
              "  pm.response.to.have.status(200);",
              "  pm.expect(b.success, 'success').to.equal(true);",
              "});",
              "pm.test('data.agreement_id', () => pm.expect(b.data.agreement_id).to.be.a('string'));",
              "pm.collectionVariables.set('agreement_id', b.data.agreement_id);"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{token}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/api/v1/ext/agreements",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "api",
            "v1",
            "ext",
            "agreements"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"title\": \"Acuerdo sin Split\",\n  \"description\": \"Sin distribucion de fondos\",\n  \"split\": false,\n  \"default_bank_account_id\": \"{{bank_account_id}}\",\n  \"payment_methods\": {\n    \"immediate_debit\": true,\n    \"crypto\": false,\n    \"mobile_payment\": true\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      }
    },
    {
      "name": "2 · Crear sesion de Boton",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "// `failure_url` también es obligatorio, y tampoco está declarado como tal.",
              "const b = pm.response.json();",
              "pm.test('200 y la sesión creada', () => {",
              "  pm.response.to.have.status(200);",
              "  pm.expect(b.success, 'success').to.equal(true);",
              "});",
              "pm.test('data.session_id y data.payment_url', () => {",
              "  pm.expect(b.data.session_id, 'data.session_id').to.be.a('string');",
              "  pm.expect(b.data.payment_url, 'data.payment_url').to.include('/pay/');",
              "});",
              "pm.collectionVariables.set('session_id', b.data.session_id);"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{token}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/api/v1/ext/payment-sessions/buttons",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "api",
            "v1",
            "ext",
            "payment-sessions",
            "buttons"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"agreement_id\": \"{{agreement_id}}\",\n  \"amount_reference\": 50,\n  \"currency_reference\": \"USD\",\n  \"identifier_label\": \"Pedido\",\n  \"identifier\": \"ORD-0001\",\n  \"description\": \"Mi primer pago de prueba\",\n  \"success_url\": \"https://ejemplo.test/gracias\",\n  \"failure_url\": \"https://ejemplo.test/fallo\",\n  \"duration_minutes\": 20\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      }
    },
    {
      "name": "3 · Forzar desenlace (plano de control)",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{token}}"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/control/sessions/{{session_id}}/outcome",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "control",
            "sessions",
            "{{session_id}}",
            "outcome"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"leg\": 1,\n  \"outcome\": \"paid\"\n}"
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('el plano de control acepta el desenlace', () => pm.response.to.have.status(200));"
            ]
          }
        }
      ]
    },
    {
      "name": "4 · Consultar estado",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Authorization",
            "value": "Bearer {{token}}"
          }
        ],
        "url": {
          "raw": "{{base_url}}/api/v1/ext/payment-sessions/status/{{session_id}}",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "api",
            "v1",
            "ext",
            "payment-sessions",
            "status",
            "{{session_id}}"
          ]
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "// Ojo con lo que este paso NO dice: `status` se queda en `paid` para siempre.",
              "// La acreditación NO cambia `status`; se ve en `data.session_payment.receiver_credits`.",
              "const b = pm.response.json();",
              "pm.test('200 y la sesión pagada', () => {",
              "  pm.response.to.have.status(200);",
              "  pm.expect(b.data.status, 'data.status').to.equal('paid');",
              "});"
            ]
          }
        }
      ]
    }
  ]
}
