{
  "name": "Seguimiento de presupuestos (plantilla de Cauce)",
  "nodes": [
    {
      "parameters": {
        "content": "## Seguimiento de presupuestos\nCada mañana revisa tu hoja de presupuestos y te manda **un solo correo** con los que toca llamar hoy o están atrasados, agrupados por persona.\n\n**Antes de activarla:**\n1. Sube a Google Drive la plantilla de Excel de Cauce (o usa una hoja con las mismas columnas) y ábrela como Hoja de cálculo de Google.\n2. En **Leer presupuestos**, conecta tu cuenta de Google y pega la URL de la hoja.\n3. En **Enviar resumen**, conecta tu correo (SMTP) y pon el remitente y a quién llega.\n4. Cambia la hora en **Cada mañana** si quieres y activa el flujo.\n\nRitmo: días 2, 5, 9 y 14 desde el envío. Se puede cambiar en el nodo **Elegir los de hoy**.\n\nPlantilla gratuita de Cauce · cauceautomation.es/automatizacion-de-procesos/plantillas-n8n",
        "height": 420,
        "width": 520,
        "color": 4
      },
      "id": "34d617a2-45eb-51a9-a47a-c8cd328e382b",
      "name": "Cómo usar esta plantilla",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -80,
        -380
      ]
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1,
                2,
                3,
                4,
                5
              ],
              "triggerAtHour": 8
            }
          ]
        }
      },
      "id": "0fb724de-d6d8-5426-8854-e7221289196e",
      "name": "Cada mañana",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        100
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "",
          "mode": "url"
        },
        "sheetName": {
          "__rl": true,
          "value": "Presupuestos",
          "mode": "name"
        },
        "options": {}
      },
      "id": "e1730883-334a-5726-905a-d81d2c9198db",
      "name": "Leer presupuestos",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        240,
        100
      ],
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "jsCode": "const DIA = 86400000;\nfunction fecha(v) {\n  if (v === null || v === undefined || v === '') return null;\n  if (typeof v === 'number') return Date.UTC(1899, 11, 30) + Math.floor(v) * DIA;\n  const s = String(v).trim();\n  let m = s.match(/^(\\d{1,2})[\\/.-](\\d{1,2})[\\/.-](\\d{2,4})/);\n  if (m) { let y = +m[3]; if (y < 100) y += 2000; return Date.UTC(y, +m[2] - 1, +m[1]); }\n  m = s.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n  if (m) return Date.UTC(+m[1], +m[2] - 1, +m[3]);\n  return null;\n}\nconst HOY = Date.UTC($now.year, $now.month - 1, $now.day);\nconst ddmm = (t) => new Date(t).toISOString().slice(0, 10).split('-').reverse().join('/');\nconst esc = (s) => String(s ?? '').replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]));\n\n// Mismo ritmo que la plantilla de Excel de Cauce: seguimiento los días 2, 5, 9 y 14 desde el envío.\nconst RITMO = [2, 5, 9, 14];\n\nconst pendientes = [];\nfor (const item of $input.all()) {\n  const r = item.json;\n  const envio = fecha(r['Fecha de envío']);\n  const estado = String(r['Estado'] ?? '').trim().toLowerCase();\n  if (!envio || estado === 'aceptado' || estado === 'rechazado') continue;\n  const ultimo = fecha(r['Último contacto']) ?? envio;\n  const siguiente = RITMO.map((d) => envio + d * DIA).find((f) => ultimo < f);\n  if (siguiente !== undefined && siguiente > HOY) continue;\n  pendientes.push({\n    quien: String(r['Quién lo lleva'] ?? '').trim() || 'Sin asignar',\n    cliente: r['Cliente'], contacto: r['Teléfono o email'], que: r['Qué se presupuesta'], importe: r['Importe sin IVA (€)'],\n    envio: ddmm(envio),\n    toca: siguiente === undefined ? 'Decidir: ya se hizo el seguimiento del día 14' : (siguiente < HOY ? `Atrasado (tocaba el ${ddmm(siguiente)})` : 'Hoy'),\n  });\n}\nif (pendientes.length === 0) return [];\n\nconst grupos = {};\nfor (const p of pendientes) (grupos[p.quien] ??= []).push(p);\nlet html = `<p>Presupuestos que necesitan seguimiento hoy (${ddmm(HOY)}):</p>`;\nfor (const [quien, lista] of Object.entries(grupos)) {\n  html += `<h3>${esc(quien)} (${lista.length})</h3><ul>` + lista.map((p) =>\n    `<li><b>${esc(p.cliente)}</b> · ${esc(p.que)} · ${esc(p.importe)} € · enviado el ${p.envio} · ${esc(p.contacto)}<br><i>${esc(p.toca)}</i></li>`).join('') + '</ul>';\n}\nhtml += '<p>Cuando contactes, apunta la fecha en «Último contacto». Si el cliente dice sí o no, cambia el «Estado».</p>';\nreturn [{ json: { asunto: `Seguimiento de presupuestos: ${pendientes.length} para hoy`, html, total: pendientes.length } }];"
      },
      "id": "9743787d-0cd1-5907-bfab-59c0cb240af9",
      "name": "Elegir los de hoy",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        480,
        100
      ]
    },
    {
      "parameters": {
        "fromEmail": "",
        "toEmail": "",
        "subject": "={{ $json.asunto }}",
        "emailFormat": "html",
        "html": "={{ $json.html }}",
        "options": {}
      },
      "id": "8909c190-0110-5cd5-8824-fb6aa0603a0c",
      "name": "Enviar resumen",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        720,
        100
      ]
    }
  ],
  "connections": {
    "Cada mañana": {
      "main": [
        [
          {
            "node": "Leer presupuestos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Leer presupuestos": {
      "main": [
        [
          {
            "node": "Elegir los de hoy",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Elegir los de hoy": {
      "main": [
        [
          {
            "node": "Enviar resumen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Madrid"
  },
  "meta": {
    "templateCredsSetupCompleted": false,
    "source": "Plantilla gratuita de Cauce · cauceautomation.es/automatizacion-de-procesos/plantillas-n8n"
  },
  "tags": []
}
