{
  "name": "Fotos Faciledita — Funil Principal",
  "nodes": [
    {
      "id": "webhook-entrada",
      "name": "Webhook Evolution",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [80, 300],
      "parameters": {
        "path": "evolution-fotos",
        "httpMethod": "POST",
        "responseMode": "lastNode",
        "responseData": "firstEntryJson"
      }
    },
    {
      "id": "extrai-mensagem",
      "name": "Extrai dados da mensagem",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [280, 300],
      "parameters": {
        "assignments": {
          "assignments": [
            { "id": "phone",    "name": "phone",    "value": "={{ $json.data.key.remoteJid.replace('@s.whatsapp.net','') }}", "type": "string" },
            { "id": "text",     "name": "text",     "value": "={{ ($json.data.message.conversation || $json.data.message.extendedTextMessage?.text || '').trim().toLowerCase() }}", "type": "string" },
            { "id": "msgType",  "name": "msgType",  "value": "={{ Object.keys($json.data.message)[0] }}", "type": "string" },
            { "id": "wppName",  "name": "wppName",  "value": "={{ $json.data.pushName || '' }}", "type": "string" },
            { "id": "ddd",      "name": "ddd",      "value": "={{ $json.data.key.remoteJid.replace('@s.whatsapp.net','').substring(2,4) }}", "type": "string" }
          ]
        }
      }
    },
    {
      "id": "ignora-grupos",
      "name": "Ignora grupos e bots",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [480, 300],
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": false },
          "conditions": [
            { "leftValue": "={{ $json.phone }}", "operator": { "type": "string", "operation": "notContains" }, "rightValue": "@g.us" },
            { "leftValue": "={{ $json.phone }}", "operator": { "type": "string", "operation": "notEndsWith" }, "rightValue": "@broadcast" }
          ],
          "combinator": "and"
        }
      }
    },
    {
      "id": "busca-lead",
      "name": "Busca lead no CRM",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [680, 200],
      "parameters": {
        "method": "GET",
        "url": "={{ $vars.API_URL }}",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            { "name": "action", "value": "leads_list" },
            { "name": "q",      "value": "={{ $json.phone }}" }
          ]
        }
      }
    },
    {
      "id": "lead-existe",
      "name": "Lead já existe?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [880, 200],
      "parameters": {
        "conditions": {
          "conditions": [
            { "leftValue": "={{ $json.data.total }}", "operator": { "type": "number", "operation": "gt" }, "rightValue": 0 }
          ]
        }
      }
    },
    {
      "id": "cria-lead",
      "name": "Cria novo lead",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [1080, 320],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.API_URL }}?action=lead_create",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            { "name": "phone",         "value": "={{ $('extrai-mensagem').item.json.phone }}" },
            { "name": "ddd",           "value": "={{ $('extrai-mensagem').item.json.ddd }}" },
            { "name": "whatsapp_name", "value": "={{ $('extrai-mensagem').item.json.wppName }}" },
            { "name": "status",        "value": "new" }
          ]
        }
      }
    },
    {
      "id": "monta-contexto",
      "name": "Monta contexto do lead",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [1280, 200],
      "parameters": {
        "assignments": {
          "assignments": [
            { "id": "leadId",     "name": "leadId",     "value": "={{ ($('lead-existe').item.json.data?.leads?.[0]?.id) || $json.data?.id }}", "type": "number" },
            { "id": "leadStatus", "name": "leadStatus", "value": "={{ ($('lead-existe').item.json.data?.leads?.[0]?.status) || 'new' }}", "type": "string" },
            { "id": "phone",      "name": "phone",      "value": "={{ $('extrai-mensagem').item.json.phone }}", "type": "string" },
            { "id": "text",       "name": "text",       "value": "={{ $('extrai-mensagem').item.json.text }}", "type": "string" },
            { "id": "msgType",    "name": "msgType",    "value": "={{ $('extrai-mensagem').item.json.msgType }}", "type": "string" }
          ]
        }
      }
    },
    {
      "id": "roteador-status",
      "name": "Roteia por status do lead",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3,
      "position": [1480, 200],
      "parameters": {
        "mode": "expression",
        "output": "={{ $json.leadStatus }}",
        "rules": {
          "rules": [
            { "outputKey": "new",          "value": "new" },
            { "outputKey": "browsing",     "value": "browsing" },
            { "outputKey": "selected",     "value": "selected" },
            { "outputKey": "photos_sent",  "value": "photos_sent" },
            { "outputKey": "preview_sent", "value": "preview_sent" },
            { "outputKey": "awaiting_pay", "value": "awaiting_pay" }
          ]
        }
      }
    },
    {
      "id": "envia-boas-vindas",
      "name": "Envia boas-vindas + catálogo",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [1700, 80],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.EVOLUTION_URL }}/message/sendText/{{ $vars.EVOLUTION_INSTANCE }}",
        "sendHeaders": true,
        "headerParameters": { "parameters": [{ "name": "apikey", "value": "={{ $vars.EVOLUTION_KEY }}" }] },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"number\": \"{{ $json.phone }}\",\n  \"options\": { \"delay\": 1200 },\n  \"textMessage\": {\n    \"text\": \"✨ Olá! Bem-vindo(a) à *Fotos Faciledita*!\\n\\nTransformamos suas fotos em ensaios digitais incríveis com inteligência artificial 🤩\\n\\n🔗 *Veja nosso catálogo de modelos:*\\n{{ $vars.CATALOG_URL }}\\n\\nEscolha seus modelos favoritos e responda aqui com os *códigos* (ex: A01, N12, J03).\\n\\n💰 *Preços:*\\n• 3 fotos — R$ 9,90\\n• 5 fotos — R$ 15,00\\n• 10 fotos — R$ 25,00\"\n  }\n}"
      }
    },
    {
      "id": "atualiza-status-browsing",
      "name": "Atualiza lead → browsing",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [1700, 180],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.API_URL }}?action=lead_update",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={ \"id\": {{ $json.leadId }}, \"status\": \"browsing\" }"
      }
    },
    {
      "id": "processa-codigos",
      "name": "Extrai códigos de modelos",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [1700, 320],
      "parameters": {
        "jsCode": "const text = items[0].json.text.toUpperCase();\nconst codes = [...text.matchAll(/[A-Z]\\d{2}/g)].map(m => m[0]);\nconst unique = [...new Set(codes)];\nreturn [{ json: { ...items[0].json, modelCodes: unique, codesFound: unique.length > 0 } }];"
      }
    },
    {
      "id": "tem-codigos",
      "name": "Enviou códigos válidos?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [1900, 320],
      "parameters": {
        "conditions": {
          "conditions": [{ "leftValue": "={{ $json.codesFound }}", "operator": { "type": "boolean", "operation": "true" } }]
        }
      }
    },
    {
      "id": "confirma-modelos",
      "name": "Confirma modelos e pede fotos",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [2100, 280],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.EVOLUTION_URL }}/message/sendText/{{ $vars.EVOLUTION_INSTANCE }}",
        "sendHeaders": true,
        "headerParameters": { "parameters": [{ "name": "apikey", "value": "={{ $vars.EVOLUTION_KEY }}" }] },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"number\": \"{{ $json.phone }}\",\n  \"options\": { \"delay\": 1000 },\n  \"textMessage\": {\n    \"text\": \"✅ *Modelos anotados:* {{ $json.modelCodes.join(', ') }}\\n\\nAgora envie *5 fotos do seu rosto* (frente, lados, sorrindo) para gerarmos com a sua aparência.\\n\\n📌 _Quanto mais fotos e ângulos, melhor o resultado!_\"\n  }\n}"
      }
    },
    {
      "id": "atualiza-selected",
      "name": "Atualiza lead → selected",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [2100, 380],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.API_URL }}?action=lead_update",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={ \"id\": {{ $json.leadId }}, \"status\": \"selected\" }"
      }
    },
    {
      "id": "recebeu-fotos",
      "name": "Recebeu imagens de rosto?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [1700, 460],
      "parameters": {
        "conditions": {
          "conditions": [
            { "leftValue": "={{ $json.msgType }}", "operator": { "type": "string", "operation": "equals" }, "rightValue": "imageMessage" }
          ]
        }
      }
    },
    {
      "id": "confirma-fotos",
      "name": "Confirma recebimento e gera cobrança",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [1900, 440],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.EVOLUTION_URL }}/message/sendText/{{ $vars.EVOLUTION_INSTANCE }}",
        "sendHeaders": true,
        "headerParameters": { "parameters": [{ "name": "apikey", "value": "={{ $vars.EVOLUTION_KEY }}" }] },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"number\": \"{{ $json.phone }}\",\n  \"options\": { \"delay\": 800 },\n  \"textMessage\": {\n    \"text\": \"📸 Fotos recebidas! Vou gerar um preview para você aprovar antes de pagar.\\n\\n⏳ _Aguarde alguns minutinhos..._\"\n  }\n}"
      }
    },
    {
      "id": "atualiza-photos-sent",
      "name": "Atualiza lead → photos_sent",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [2100, 440],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.API_URL }}?action=lead_update",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={ \"id\": {{ $json.leadId }}, \"status\": \"photos_sent\" }"
      }
    },
    {
      "id": "processa-pagamento",
      "name": "Lead confirmou pagamento?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [1700, 580],
      "parameters": {
        "conditions": {
          "conditions": [
            { "leftValue": "={{ $json.text }}", "operator": { "type": "string", "operation": "contains" }, "rightValue": "paguei" }
          ]
        }
      }
    },
    {
      "id": "envia-pix",
      "name": "Envia QR Code Pix",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [1900, 560],
      "parameters": {
        "method": "POST",
        "url": "={{ $vars.API_URL }}?action=generate_pix",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={ \"lead_id\": {{ $json.leadId }} }"
      }
    }
  ],
  "connections": {
    "Webhook Evolution": { "main": [[{ "node": "Extrai dados da mensagem", "type": "main", "index": 0 }]] },
    "Extrai dados da mensagem": { "main": [[{ "node": "Ignora grupos e bots", "type": "main", "index": 0 }]] },
    "Ignora grupos e bots": { "main": [[{ "node": "Busca lead no CRM", "type": "main", "index": 0 }]] },
    "Busca lead no CRM": { "main": [[{ "node": "Lead já existe?", "type": "main", "index": 0 }]] },
    "Lead já existe?": {
      "main": [
        [{ "node": "Monta contexto do lead", "type": "main", "index": 0 }],
        [{ "node": "Cria novo lead", "type": "main", "index": 0 }]
      ]
    },
    "Cria novo lead": { "main": [[{ "node": "Monta contexto do lead", "type": "main", "index": 0 }]] },
    "Monta contexto do lead": { "main": [[{ "node": "Roteia por status do lead", "type": "main", "index": 0 }]] },
    "Roteia por status do lead": {
      "main": [
        [{ "node": "Envia boas-vindas + catálogo", "type": "main", "index": 0 }],
        [{ "node": "Extrai códigos de modelos", "type": "main", "index": 0 }],
        [{ "node": "Recebeu imagens de rosto?", "type": "main", "index": 0 }],
        [{ "node": "Recebeu imagens de rosto?", "type": "main", "index": 0 }],
        [{ "node": "Processa pagamento confirmado?", "type": "main", "index": 0 }],
        [{ "node": "Processa pagamento confirmado?", "type": "main", "index": 0 }]
      ]
    },
    "Envia boas-vindas + catálogo": { "main": [[{ "node": "Atualiza lead → browsing", "type": "main", "index": 0 }]] },
    "Extrai códigos de modelos": { "main": [[{ "node": "Enviou códigos válidos?", "type": "main", "index": 0 }]] },
    "Enviou códigos válidos?": {
      "main": [
        [{ "node": "Confirma modelos e pede fotos", "type": "main", "index": 0 }],
        []
      ]
    },
    "Confirma modelos e pede fotos": { "main": [[{ "node": "Atualiza lead → selected", "type": "main", "index": 0 }]] },
    "Recebeu imagens de rosto?": {
      "main": [
        [{ "node": "Confirma recebimento e gera cobrança", "type": "main", "index": 0 }],
        []
      ]
    },
    "Confirma recebimento e gera cobrança": { "main": [[{ "node": "Atualiza lead → photos_sent", "type": "main", "index": 0 }]] },
    "Processa pagamento confirmado?": {
      "main": [
        [{ "node": "Envia QR Code Pix", "type": "main", "index": 0 }],
        []
      ]
    }
  },
  "settings": { "executionOrder": "v1" },
  "staticData": null,
  "meta": { "templateCredsSetupCompleted": false },
  "pinData": {}
}
