{ "name": "Generar reporte de rutas PDF", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "generar-rutas-pdf", "responseMode": "responseNode", "options": {} }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [-600, 260], "id": "e91ef4ce-4c71-4a7b-91d7-1a4f1c2db015", "name": "Webhook: Generate PDF" }, { "parameters": { "jsCode": "const payload = $json.body && typeof $json.body === 'object' ? $json.body : $json;\nconst errors = [];\nif (!payload?.project?.id || !payload?.project?.name) errors.push('Se requiere la información del proyecto.');\nif (!Array.isArray(payload?.assignedRoutes)) errors.push('assignedRoutes debe ser una lista.');\nif (!Array.isArray(payload?.unassignedPdvs)) errors.push('unassignedPdvs debe ser una lista.');\nif ((payload?.assignedRoutes?.length ?? 0) + (payload?.unassignedPdvs?.length ?? 0) > 5000) errors.push('El reporte excede el máximo de 5,000 registros.');\nif (errors.length) throw new Error(errors.join(' '));\nreturn [{ json: { payload } }];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [-360, 260], "id": "abbd2d6e-5c04-4bbb-ae1b-e4f0d2e4574e", "name": "Validate Report Payload", "onError": "continueErrorOutput" }, { "parameters": { "jsCode": "const payload = $json.payload;\nconst escape = value => String(value ?? '').replace(/[&<>\"']/g, char => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[char]));\nconst filters = Object.entries(payload.filters ?? {}).filter(([, value]) => value).map(([key, value]) => `${escape(key)}: ${escape(value)}`).join('');\nconst routeRows = payload.assignedRoutes.map(route => `
Filtros aplicados: Ninguno
'}| Usuario | Día | Orden | PDV | Origen | Distancia | Trabajo |
|---|
| PDV ID | PDV | Horas/semana | Motivo | Recomendación |
|---|