{
  "name": "DiGiFlowAI — Préparer des relances — démonstration sans envoi",
  "nodes": [
    {
      "id": "preparation-relances-start",
      "name": "Démarrer manuellement",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "parameters": {}
    },
    {
      "id": "preparation-relances-data",
      "name": "Données fictives à modifier",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        0
      ],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "return [\n  {\n    \"id\": \"FACT-DEMO-1\",\n    \"echeance\": \"2026-10-01\",\n    \"dateReference\": \"2026-10-09\",\n    \"payee\": false\n  },\n  {\n    \"id\": \"FACT-DEMO-2\",\n    \"echeance\": \"2026-10-01\",\n    \"dateReference\": \"2026-10-09\",\n    \"payee\": true\n  },\n  {\n    \"id\": \"FACT-DEMO-3\",\n    \"echeance\": \"2026-10-20\",\n    \"dateReference\": \"2026-10-09\",\n    \"payee\": false\n  }\n].map(json => ({ json }));"
      }
    },
    {
      "id": "preparation-relances-logic",
      "name": "Contrôler les données",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        480,
        0
      ],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "function parseDate(s) {\n  if (typeof s !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return null;\n  const d = new Date(s + 'T00:00:00Z');\n  return Number.isFinite(d.getTime()) && d.toISOString().slice(0, 10) === s ? d : null;\n}\nreturn $input.all().map(({ json }) => {\n  const echeance = parseDate(json.echeance);\n  const reference = parseDate(json.dateReference);\n  const valide = !!echeance && !!reference && typeof json.payee === 'boolean';\n  const joursRetard = valide ? Math.max(0, Math.floor((reference - echeance) / 86400000)) : null;\n  return { json: { ...json, joursRetard, statut: !valide ? 'a_verifier' : json.payee ? 'payee' : joursRetard > 0 ? 'relance_a_valider' : 'non_echue', messageEnvoye: false } };\n});"
      },
      "notesInFlow": true,
      "notes": "Exercice local. Aucune connexion externe, aucun envoi, aucune suppression. Prévoir authentification, stockage persistant, gestion des doublons et alertes avant une utilisation réelle."
    }
  ],
  "connections": {
    "Démarrer manuellement": {
      "main": [
        [
          {
            "node": "Données fictives à modifier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Données fictives à modifier": {
      "main": [
        [
          {
            "node": "Contrôler les données",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Brussels"
  },
  "pinData": {},
  "tags": []
}
