{
  "name": "Contrôle SIREN : alertes de surveillance et fichiers prêts",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "controlesiren",
        "options": {
          "rawBody": true
        }
      },
      "id": "n1",
      "name": "Webhook Contrôle SIREN",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "webhookId": "controlesiren-alertes"
    },
    {
      "parameters": {
        "jsCode": "// Vérifie la signature HMAC-SHA256 envoyée par Contrôle SIREN (en-têtes X-Controlesiren-Timestamp et X-Controlesiren-Signature).\n// Auto-hébergement : définir NODE_FUNCTION_ALLOW_BUILTIN=crypto pour que n8n autorise le module « crypto ».\nconst SECRET = 'COLLEZ_ICI_VOTRE_SECRET_DE_SIGNATURE'; // celui affiché dans Paramètres > Webhook de Contrôle SIREN\nconst TOLERANCE_SECONDES = 300;\nconst crypto = require('crypto');\n\nconst entetes = $input.first().json.headers || {};\nconst horodatage = entetes['x-controlesiren-timestamp'];\nconst signature = entetes['x-controlesiren-signature'];\nif (!horodatage || !signature) throw new Error('Signature absente : activez le secret de signature dans Contrôle SIREN.');\n\nconst brut = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');\nconst attendue = 'v1=' + crypto.createHmac('sha256', SECRET).update(horodatage + '.' + brut).digest('hex');\nconst a = Buffer.from(attendue);\nconst b = Buffer.from(signature);\nif (a.length !== b.length || !crypto.timingSafeEqual(a, b)) throw new Error('Signature invalide : message ignoré.');\nif (Math.abs(Date.now() / 1000 - Number(horodatage)) > TOLERANCE_SECONDES) throw new Error('Horodatage trop ancien : message ignoré.');\n\nreturn [{ json: JSON.parse(brut) }];\n"
      },
      "id": "n2",
      "name": "Vérifier la signature",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        0
      ]
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "c1",
                    "leftValue": "={{ $json.event }}",
                    "rightValue": "surveillance_alerte",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Alerte de surveillance"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "c2",
                    "leftValue": "={{ $json.event }}",
                    "rightValue": "verification_terminee",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Fichier prêt"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "c3",
                    "leftValue": "={{ $json.event }}",
                    "rightValue": "recherche_nouveaux_resultats",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Nouveaux résultats de recherche"
            }
          ]
        },
        "options": {}
      },
      "id": "n3",
      "name": "Type d'événement",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        480,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "message",
              "value": "=⚠️ {{ $json.nom }} (SIREN {{ $json.siren }}) : {{ $json.alerts.map(a => a.message).join(' ; ') }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "siren",
              "value": "={{ $json.siren }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "n4",
      "name": "Préparer le message d'alerte",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        720,
        -100
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "b1",
              "name": "message",
              "value": "=✅ Votre vérification est terminée. Fichier résultat : {{ $json.report_url }}",
              "type": "string"
            },
            {
              "id": "b2",
              "name": "job_id",
              "value": "={{ $json.job_id }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "n5",
      "name": "Préparer le message fichier prêt",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        720,
        100
      ]
    },
    {
      "parameters": {},
      "id": "n6",
      "name": "À remplacer par Slack, Gmail, HubSpot…",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        960,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "d1",
              "name": "message",
              "value": "=🔎 {{ $json.resultats.length }} nouvelle(s) entreprise(s) pour la recherche « {{ $json.recherche }} » : {{ $json.resultats.map(r => r.nom + ' (' + r.siren + ')').join(', ') }}",
              "type": "string"
            },
            {
              "id": "d2",
              "name": "recherche_id",
              "value": "={{ $json.recherche_id }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "n7",
      "name": "Préparer le message de recherche",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        720,
        300
      ]
    }
  ],
  "connections": {
    "Webhook Contrôle SIREN": {
      "main": [
        [
          {
            "node": "Vérifier la signature",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Vérifier la signature": {
      "main": [
        [
          {
            "node": "Type d'événement",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Type d'événement": {
      "main": [
        [
          {
            "node": "Préparer le message d'alerte",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Préparer le message fichier prêt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Préparer le message de recherche",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Préparer le message d'alerte": {
      "main": [
        [
          {
            "node": "À remplacer par Slack, Gmail, HubSpot…",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Préparer le message fichier prêt": {
      "main": [
        [
          {
            "node": "À remplacer par Slack, Gmail, HubSpot…",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Préparer le message de recherche": {
      "main": [
        [
          {
            "node": "À remplacer par Slack, Gmail, HubSpot…",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "meta": {
    "templateCredsSetupCompleted": false
  }
}