{
  "name": "DeCAred · Confirmar propuesta aprobada",
  "nodes": [
    {
      "parameters": {
        "content": "# Confirmar propuesta aprobada · API 1.3\n\nRevisa primero el resumen y contenido exactos de la preparación. Configura ID, token y aprobación en «Aprobación expresa». Usa la misma clave de API que preparó la operación. Caduca a los 15 minutos.\n\nNo actives reintentos automáticos. Si hay timeout, consulta GET /operations/{id}; `uncertain`/`executing` exigen conciliación manual. `completed` permite recuperar el resultado persistido sin repetir el efecto.\n\n**Clave de API.** Crea una credencial *Header Auth* llamada «Clave de API de DeCAred»:\n- Name: `Authorization`\n- Value: `Bearer dcr_…` (tu clave de DeCAred → Más → Integraciones)\n\nDespués de usarlo borra el token del nodo y de las ejecuciones. No exportes el flujo configurado ni lo compartas.",
        "height": 520,
        "width": 430,
        "color": 4
      },
      "id": "5bc3ee4f-7ca0-52fd-8fd4-16bd12c9d4a3",
      "name": "Nota",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -450,
        -250
      ]
    },
    {
      "parameters": {},
      "id": "0ae89eb3-8909-55eb-bedc-54350ee16ef7",
      "name": "Manual",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "const approved = false; // Cambiar solo después de revisar la propuesta exacta.\nconst operationId = ''; // ID de la propuesta aprobada.\nconst confirmationToken = ''; // Token de esa misma propuesta. No compartir/exportar.\nif (approved !== true) throw new Error('Falta aprobación expresa de la propuesta exacta');\nif (!/^[0-9a-f-]{36}$/i.test(operationId) || !confirmationToken) throw new Error('Configura ID y token de la propuesta aprobada');\nreturn [{json: {operation_id: operationId, confirmation_token: confirmationToken}}];"
      },
      "id": "a724cade-5bb9-5594-bd63-eb1588cdc9aa",
      "name": "Aprobación expresa",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "method": "GET",
        "url": "={{ \"https://decared.com/api/v1\" + '/operations/' + $json.operation_id }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {}
      },
      "id": "ac216791-2498-5354-ade5-068c4ff5695a",
      "name": "Estado de operación",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        0
      ],
      "credentials": {
        "httpHeaderAuth": {
          "id": "",
          "name": "Clave de API de DeCAred"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const operation = $input.first().json.data;\nif (!['prepared', 'completed'].includes(operation.status)) throw new Error('No confirmar: estado ' + operation.status + '. Reconciliar manualmente.');\nif (operation.status === 'prepared' && (!Number.isFinite(Date.parse(operation.expires_at)) || Date.parse(operation.expires_at) <= Date.now())) throw new Error('Propuesta caducada: preparar y aprobar otra');\nreturn $input.all();"
      },
      "id": "5ca4c97d-877f-5e26-b987-b86a016c7ab6",
      "name": "Comprobar estado",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        0
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ \"https://decared.com/api/v1\" + '/operations/' + $('Aprobación expresa').first().json.operation_id + '/confirm' }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {},
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({confirmed: true, confirmation_token: $('Aprobación expresa').first().json.confirmation_token}) }}"
      },
      "id": "45d71478-f81b-5d33-b701-1459822f7fb5",
      "name": "Confirmar operación",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        880,
        0
      ],
      "credentials": {
        "httpHeaderAuth": {
          "id": "",
          "name": "Clave de API de DeCAred"
        }
      }
    }
  ],
  "connections": {
    "Manual": {
      "main": [
        [
          {
            "node": "Aprobación expresa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aprobación expresa": {
      "main": [
        [
          {
            "node": "Estado de operación",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Estado de operación": {
      "main": [
        [
          {
            "node": "Comprobar estado",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comprobar estado": {
      "main": [
        [
          {
            "node": "Confirmar operación",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "pinData": {}
}
