{
  "name": "DeCAred · DeCA emitido → PDF por correo",
  "nodes": [
    {
      "parameters": {
        "content": "## DeCA emitido → PDF por correo\n\n1. Activa el flujo y copia la *Production URL* del nodo «Aviso de DeCAred».\n2. En DeCAred → Más → Integraciones, añade esa dirección con el evento «Documento emitido». Copia el secreto que se muestra.\n3. Crea una credencial *Crypto* con ese secreto en «Hmac Secret» y elígela en «Calcular firma».\n4. **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   \n**Permiso de la clave:** `documents:read`. Las claves generales de lectura y escritura ya lo incluyen.\n\n5. Configura tu correo (SMTP) y el destinatario en «Enviar por correo».\n\nTu n8n debe ser accesible desde Internet con https://.",
        "height": 520,
        "width": 480,
        "color": 4
      },
      "id": "04e3fe54-d11e-55ff-88ad-ed823f843036",
      "name": "Nota",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -520,
        -200
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "decared-avisos",
        "responseMode": "onReceived",
        "options": {
          "rawBody": true
        }
      },
      "id": "f3d8740d-0e3c-5e0c-90ed-f5959f8cab9b",
      "name": "Aviso de DeCAred",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "webhookId": "2a5a8030-a256-5af1-a592-3c578ff2e3ec"
    },
    {
      "parameters": {
        "jsCode": "// Cuerpo exacto recibido y cabecera DeCAred-Signature: t=<unix>,v1=<hex>.\nconst item = $input.first();\nconst raw = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');\nconst header = item.json.headers['decared-signature'] || '';\nconst match = /^t=(\\d+),v1=([a-f0-9]{64})$/.exec(header);\nreturn [{ json: {\n  t: match ? Number(match[1]) : 0,\n  v1: match ? match[2] : '',\n  firmado: match ? `${match[1]}.${raw}` : '',\n  aviso: item.json.body,\n} }];"
      },
      "id": "57f706a5-a706-5ac3-a4a4-841af2c5a2c8",
      "name": "Preparar firma",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "action": "hmac",
        "type": "SHA256",
        "value": "={{ $json.firmado }}",
        "dataPropertyName": "calculada",
        "encoding": "hex"
      },
      "id": "e70e080d-d161-52a4-bf62-0c2f706a0095",
      "name": "Calcular firma",
      "type": "n8n-nodes-base.crypto",
      "typeVersion": 2,
      "position": [
        440,
        0
      ],
      "credentials": {
        "crypto": {
          "id": "",
          "name": "Secreto del aviso de DeCAred"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Sigue solo si la firma coincide, tiene menos de 5 minutos y el aviso es una emisión.\nconst salida = [];\nfor (const item of $input.all()) {\n  const j = item.json;\n  const reciente = Math.abs(Date.now() / 1000 - j.t) < 300;\n  if (j.v1 && j.calculada === j.v1 && reciente && j.aviso.event === 'document.issued') {\n    salida.push({ json: { ...j.aviso.data, event_id: j.aviso.id } });\n  }\n}\nreturn salida;"
      },
      "id": "97b87fd1-d244-5843-980d-7f0d7c39a250",
      "name": "Comprobar firma y evento",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        0
      ]
    },
    {
      "parameters": {
        "method": "GET",
        "url": "={{ $json.current_version.pdf_url }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "3b42cc9b-7248-5413-9f26-f1187932cd12",
      "name": "Descargar PDF",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        880,
        0
      ],
      "credentials": {
        "httpHeaderAuth": {
          "id": "",
          "name": "Clave de API de DeCAred"
        }
      }
    },
    {
      "parameters": {
        "fromEmail": "trafico@tuempresa.es",
        "toEmail": "administracion@tuempresa.es",
        "subject": "=DeCA emitido: {{ $('Comprobar firma y evento').item.json.reference }}",
        "emailFormat": "text",
        "text": "=Se ha emitido el documento {{ $('Comprobar firma y evento').item.json.reference }} (servicio del {{ $('Comprobar firma y evento').item.json.service_date }}).\nMatrícula: {{ $('Comprobar firma y evento').item.json.vehicle?.plate }}\nEnlace del QR: {{ $('Comprobar firma y evento').item.json.current_version.public_url }}",
        "options": {
          "attachments": "data"
        }
      },
      "id": "ced1ac92-bcaa-5e53-9a47-14833bc99093",
      "name": "Enviar por correo",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        1100,
        0
      ],
      "credentials": {
        "smtp": {
          "id": "",
          "name": "SMTP"
        }
      }
    }
  ],
  "connections": {
    "Aviso de DeCAred": {
      "main": [
        [
          {
            "node": "Preparar firma",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Preparar firma": {
      "main": [
        [
          {
            "node": "Calcular firma",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calcular firma": {
      "main": [
        [
          {
            "node": "Comprobar firma y evento",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comprobar firma y evento": {
      "main": [
        [
          {
            "node": "Descargar PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Descargar PDF": {
      "main": [
        [
          {
            "node": "Enviar por correo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "pinData": {}
}
