{
  "id": "AlexuysLeadFlowDemo",
  "name": "Alexuys | LeadFlow demo",
  "nodes": [
    {
      "parameters": {},
      "id": "manual",
      "name": "Manual demo",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "return [{\"json\":{\"name\":\"Demo Studio\",\"email\":\"studio@example.com\",\"request\":\"Website catalogue\",\"budget\":45000}},{\"json\":{\"name\":\"Demo Workshop\",\"email\":\"workshop@example.com\",\"request\":\"Telegram notifications\",\"budget\":12000}},{\"json\":{\"name\":\"Demo Studio\",\"email\":\" STUDIO@example.com \",\"request\":\"Website catalogue\",\"budget\":45000}},{\"json\":{\"name\":\"Incomplete lead\",\"email\":\"\",\"request\":\"CRM integration\",\"budget\":20000}}];"
      },
      "id": "sample-requests",
      "name": "Sample requests",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        0
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "function leadBatch(rows) {\n    if (!Array.isArray(rows) || rows.length > 1000) throw new Error('INVALID_BATCH');\n    const seen = new Set();\n    return rows.map((row, index) => {\n      const id = `L-${String(index + 1).padStart(3, '0')}`;\n      if (!row || typeof row !== 'object') return {id, status: 'invalid', reason: 'INVALID_ROW'};\n      const name = String(row.name || '').trim().slice(0, 120);\n      const email = String(row.email || '').trim().toLowerCase();\n      const request = String(row.request || '').trim().slice(0, 1000);\n      const budget = typeof row.budget === 'number' ? row.budget : NaN;\n      if (!name || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email) || !request || !Number.isSafeInteger(budget) || budget < 0) {\n        return {id, name, status: 'invalid', reason: 'CHECK_FIELDS'};\n      }\n      // Same contact and same request in one batch. Separate requests are retained.\n      const key = JSON.stringify([email, request.toLowerCase().replace(/\\s+/g, ' ')]);\n      if (seen.has(key)) return {id, name, email, status: 'duplicate', reason: 'SAME_REQUEST'};\n      seen.add(key);\n      const priority = budget >= 30000 ? 'high' : 'normal';\n      return {id, name, email, request, budget, priority, status: 'accepted',\n        crmDraft: {externalId: id, contact: {name, email}, title: request, budget, stage: 'new', priority},\n        notificationDraft: `${id} · ${name} · ${budget} RUB · ${request}`};\n    });\n  }\nreturn leadBatch($input.all().map(x => x.json)).map(json => ({json}));"
      },
      "id": "validate-and-deduplicate",
      "name": "Validate and deduplicate",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        480,
        0
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "return $input.all().map(({json}) => ({json: {...json, delivery: json.status === \"accepted\" ? \"draft_only\" : \"skipped\"}}));"
      },
      "id": "build-crm-drafts",
      "name": "Build CRM drafts",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        720,
        0
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const rows = $input.all().map(x=>x.json); return [{json:{mode:\"demo_no_external_calls\",total:rows.length,accepted:rows.filter(x=>x.status===\"accepted\").length,duplicates:rows.filter(x=>x.status===\"duplicate\").length,invalid:rows.filter(x=>x.status===\"invalid\").length,rows}}];"
      },
      "id": "execution-summary",
      "name": "Execution summary",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        960,
        0
      ]
    }
  ],
  "connections": {
    "Manual demo": {
      "main": [
        [
          {
            "node": "Sample requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sample requests": {
      "main": [
        [
          {
            "node": "Validate and deduplicate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate and deduplicate": {
      "main": [
        [
          {
            "node": "Build CRM drafts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build CRM drafts": {
      "main": [
        [
          {
            "node": "Execution summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "tags": []
}
