feat(flows):allineamento filtri

This commit is contained in:
2026-03-21 20:30:54 +00:00
parent 8394861bb3
commit 734a1a9440
14 changed files with 4186 additions and 144 deletions

View File

@@ -0,0 +1,734 @@
{
"id": "vbzQ3fgUalOPdcOq",
"name": "📄 Paperless — Bolletta Allegata",
"nodes": [
{
"id": "wb-bolletta",
"name": "📎 Webhook Bolletta",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-2200,
0
],
"webhookId": "paperless-bolletta-001",
"parameters": {
"path": "paperless-bolletta",
"httpMethod": "POST",
"responseMode": "onReceived",
"options": {}
}
},
{
"id": "gmail-get-msg",
"name": "Gmail - Leggi Messaggio",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-1900,
0
],
"parameters": {
"method": "GET",
"url": "=https://gmail.googleapis.com/gmail/v1/users/me/messages/{{ $json.body.email_id }}?format=full",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "gmailOAuth2",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"id": "qvOikS6IF0H5khr8",
"name": "Gmail account"
}
}
},
{
"id": "find-pdf",
"name": "Trova Allegato PDF",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-1600,
0
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "const msg = $input.first().json;\n// La risposta Gmail API ha payload.parts con le parti del messaggio\nfunction findAttachments(parts, results) {\n if (!parts) return;\n for (const part of parts) {\n if (part.parts) findAttachments(part.parts, results);\n if (part.body && part.body.attachmentId) {\n results.push({\n attachment_id: part.body.attachmentId,\n filename: part.filename || 'allegato.pdf',\n mime_type: part.mimeType || 'application/octet-stream',\n size: part.body.size || 0\n });\n }\n }\n}\n\nconst parts = msg.payload && msg.payload.parts ? msg.payload.parts : [];\nconst attachments = [];\nfindAttachments(parts, attachments);\n\nconst pdf = attachments.find(a =>\n a.mime_type === 'application/pdf' ||\n a.filename.toLowerCase().endsWith('.pdf')\n) || attachments[0];\n\nif (!pdf) {\n throw new Error('Nessun allegato trovato nel messaggio. Parts: ' + JSON.stringify(parts).substring(0,200));\n}\n\nreturn [{json: {\n email_id: msg.id,\n thread_id: msg.threadId || msg.id,\n attachment_id: pdf.attachment_id,\n filename: pdf.filename,\n mime_type: pdf.mime_type,\n from: msg.payload?.headers?.find(h=>h.name==='From')?.value || '',\n subject: msg.payload?.headers?.find(h=>h.name==='Subject')?.value || '',\n}}];"
}
},
{
"id": "dl-att",
"name": "Gmail - Download Allegato",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-1300,
0
],
"parameters": {
"method": "GET",
"url": "=https://gmail.googleapis.com/gmail/v1/users/me/messages/{{ $json.email_id }}/attachments/{{ $json.attachment_id }}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "gmailOAuth2",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"id": "qvOikS6IF0H5khr8",
"name": "Gmail account"
}
}
},
{
"id": "decode-att",
"name": "Decodifica Allegato",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-1000,
0
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// La Gmail API restituisce il PDF in base64url (non standard base64)\nconst data = $input.first().json.data;\nif (!data) throw new Error('Nessun dato binario nella risposta attachment');\n\n// Converti base64url → base64 standard\nconst base64 = data.replace(/-/g, '+').replace(/_/g, '/');\nconst buffer = Buffer.from(base64, 'base64');\n\n// Prendi filename dal nodo precedente (Trova Allegato PDF)\nconst filename = $('Trova Allegato PDF').first().json.filename || 'bolletta.pdf';\nconst mimeType = $('Trova Allegato PDF').first().json.mime_type || 'application/pdf';\n\nconst binaryData = await this.helpers.prepareBinaryData(buffer, filename, mimeType);\nreturn [{json: {\n email_id: $('Trova Allegato PDF').first().json.email_id,\n filename,\n from: $('Trova Allegato PDF').first().json.from,\n subject: $('Trova Allegato PDF').first().json.subject,\n}, binary: { attachment: binaryData }}];"
}
},
{
"id": "pl-corresp",
"name": "Paperless - Corrispondenti",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-700,
-200
],
"parameters": {
"method": "GET",
"url": "https://docs.mt-home.uk/api/correspondents/?page_size=100",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "pl-doctypes",
"name": "Paperless - Tipi Doc",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-400,
-200
],
"parameters": {
"method": "GET",
"url": "https://docs.mt-home.uk/api/document_types/?page_size=100",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "pl-tags",
"name": "Paperless - Tag",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-100,
-200
],
"parameters": {
"method": "GET",
"url": "https://docs.mt-home.uk/api/tags/?page_size=100",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "pl-paths",
"name": "Paperless - Percorsi",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
200,
-200
],
"parameters": {
"method": "GET",
"url": "https://docs.mt-home.uk/api/storage_paths/?page_size=100",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "pl-search",
"name": "Paperless - Cerca Simili",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
500,
-200
],
"parameters": {
"method": "GET",
"url": "=https://docs.mt-home.uk/api/documents/?page_size=5&ordering=-created&search={{ encodeURIComponent($('Trova Allegato PDF').first().json.from.replace(/.*<(.*)>.*/, '$1').split('@')[0]) }}",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "build-prompt",
"name": "Build Prompt Inferenza",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
-200
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "const meta = $input.first().json;\nconst emailMeta = $('Decodifica Allegato').first().json;\n\n// Fetch all Paperless metadata from previous nodes\nconst correspondents = ($('Paperless - Corrispondenti').first().json.results || [])\n .map(c => `[${c.id}] ${c.name} (documenti: ${c.document_count||0})`).join('\\n');\n\nconst docTypes = ($('Paperless - Tipi Doc').first().json.results || [])\n .map(d => `[${d.id}] ${d.name}`).join('\\n');\n\nconst tags = ($('Paperless - Tag').first().json.results || [])\n .map(t => `[${t.id}] ${t.name}`).join('\\n');\n\nconst storagePaths = ($('Paperless - Percorsi').first().json.results || [])\n .map(s => `[${s.id}] ${s.name}`).join('\\n');\n\nconst similarDocs = ($('Paperless - Cerca Simili').first().json.results || []).slice(0, 5)\n .map(d => `- \"${d.title}\" → corrispondente: ${d.correspondent||'?'}, tipo: ${d.document_type||'?'}, tags: ${(d.tags||[]).join(',')}, path: ${d.storage_path||'?'}`)\n .join('\\n');\n\nconst prompt = `Sei un assistente che gestisce l'archivio documenti di Martin su Paperless-NGX.\nAnalizza questa email con allegato e scegli i metadati corretti per archiviare il documento.\n\nEMAIL:\n- Da: ${emailMeta.from}\n- Oggetto: ${emailMeta.subject}\n- Nome file allegato: ${emailMeta.filename}\n\nCORRISPONDENTI DISPONIBILI (usa l'ID numerico):\n${correspondents}\n\nTIPI DOCUMENTO DISPONIBILI:\n${docTypes}\n\nTAG DISPONIBILI:\n${tags}\n\nPERCORSI DI ARCHIVIAZIONE DISPONIBILI:\n${storagePaths}\n\nDOCUMENTI SIMILI GIÀ ARCHIVIATI (per riferimento):\n${similarDocs || 'Nessuno trovato'}\n\nISTRUZIONI:\n1. Identifica il corrispondente più adatto in base al mittente/oggetto. Se non esiste, metti null.\n2. Scegli il tipo documento più appropriato (Bolletta, Fattura, Ricevuta, etc.)\n3. Scegli i tag appropriati (puoi sceglierne più di uno)\n4. Scegli il percorso di archiviazione più adatto\n5. Genera un titolo breve e descrittivo in italiano (es: \"E.ON Bolletta Energia Mar 2026\")\n6. Inferisci la data del documento se possibile dall'oggetto/mittente (formato YYYY-MM-DD)\n\nRispondi SOLO con JSON valido:\n{\n \"correspondent_id\": 44,\n \"document_type_id\": 2,\n \"tag_ids\": [3],\n \"storage_path_id\": 2,\n \"title\": \"E.ON Bolletta Energia Marzo 2026\",\n \"created_date\": \"2026-03-01\",\n \"confidence_note\": \"Breve nota sul ragionamento\"\n}`;\n\nreturn [{ json: { prompt, ...meta } }];"
}
},
{
"id": "copilot-token",
"name": "Ottieni Token Copilot",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1100,
-200
],
"parameters": {
"method": "GET",
"url": "https://api.github.com/copilot_internal/v2/token",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "vBwUxlzKrX3oDHyN",
"name": "GitHub Copilot OAuth Token"
}
}
},
{
"id": "gpt41-infer",
"name": "GPT-4.1 - Inferisci Metadati",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1400,
-200
],
"parameters": {
"method": "POST",
"url": "https://api.githubcopilot.com/chat/completions",
"authentication": "none",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ 'Bearer ' + $('Ottieni Token Copilot').first().json.token }}"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Copilot-Integration-Id",
"value": "vscode-chat"
},
{
"name": "Editor-Version",
"value": "vscode/1.85.0"
}
]
},
"sendBody": true,
"contentType": "raw",
"rawContentType": "application/json",
"body": "={{ JSON.stringify({\"model\":\"gpt-4.1\",\"messages\":[{\"role\":\"system\",\"content\":\"Rispondi SOLO con JSON valido.\"},{\"role\":\"user\",\"content\": $('Build Prompt Inferenza').first().json.prompt}],\"response_format\":{\"type\":\"json_object\"},\"max_tokens\":1024}) }}",
"options": {}
}
},
{
"id": "parse-gpt",
"name": "Parse Risposta GPT",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1700,
-200
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "const raw = $input.first().json;\nconst content = (raw.choices && raw.choices[0] && raw.choices[0].message)\n ? raw.choices[0].message.content : (raw.text || '');\n\nconst cleaned = content.replace(/```json\\n?/g,'').replace(/```\\n?/g,'').trim();\n\nlet parsed;\ntry {\n parsed = JSON.parse(cleaned);\n} catch(e) {\n const m = cleaned.match(/\\{[\\s\\S]*\\}/);\n if (m) parsed = JSON.parse(m[0]);\n else throw new Error('Cannot parse GPT response: ' + content.substring(0,300));\n}\n\n// Merge with attachment binary from previous node\nconst attItem = $('Decodifica Allegato').first();\n\nreturn [{\n json: {\n correspondent_id: parsed.correspondent_id || null,\n document_type_id: parsed.document_type_id || null,\n tag_ids: parsed.tag_ids || [],\n storage_path_id: parsed.storage_path_id || null,\n title: parsed.title || 'Documento',\n created_date: parsed.created_date || null,\n confidence_note: parsed.confidence_note || '',\n filename: attItem.json.filename,\n from: attItem.json.from,\n subject: attItem.json.subject,\n },\n binary: attItem.binary\n}];"
}
},
{
"id": "prepara-upload",
"name": "Prepara Upload",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1780,
-200
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "const meta = $('Parse Risposta GPT').first().json;\nconst decodeNode = $('Decodifica Allegato').first();\nconst emailMeta = decodeNode.json;\n\n// Titolo = filename allegato senza estensione (es: \"10968276\")\nconst filename = emailMeta.filename || 'bolletta.pdf';\nconst title = filename.replace(/\\.[^/.]+$/, '');\n\n// Data = data ricezione email (internalDate è in millisecondi)\nconst internalDate = $('Gmail - Leggi Messaggio').first().json.internalDate;\nconst receivedISO = internalDate\n ? new Date(parseInt(internalDate)).toISOString()\n : null;\n\n// Parse tag_ids\nlet tag_ids = meta.tag_ids;\nif (typeof tag_ids === 'string') {\n try { tag_ids = JSON.parse(tag_ids); } catch(e) { tag_ids = []; }\n}\n\nconst result = {\n title,\n filename,\n correspondent_id: meta.correspondent_id != null ? Number(meta.correspondent_id) : null,\n document_type_id: meta.document_type_id != null ? Number(meta.document_type_id) : null,\n storage_path_id: meta.storage_path_id != null ? Number(meta.storage_path_id) : null,\n tag_ids: Array.isArray(tag_ids) ? tag_ids.map(Number).filter(n => !isNaN(n)) : [],\n created_date: receivedISO,\n};\n\nreturn [{ json: result, binary: decodeNode.binary }];"
}
},
{
"id": "pl-upload",
"name": "Paperless - Upload Documento",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
2000,
-200
],
"parameters": {
"method": "POST",
"url": "https://docs.mt-home.uk/api/documents/post_document/",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "document",
"inputDataFieldName": "attachment"
},
{
"name": "title",
"value": "={{ $json.title }}"
}
]
},
"options": {
"response": {
"response": {
"responseFormat": "text"
}
}
}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "tg-confirm",
"name": "Telegram - Conferma Upload",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2300,
-200
],
"parameters": {
"chatId": "-4814221197",
"text": "={{ '✅ *Documento archiviato su Paperless!*\\n\\n📄 *' + $('Prepara Upload').first().json.filename + '*\\n🗂 ' + $('Prepara Upload').first().json.title + '\\n' + ($('Estrai Document ID').first().json.is_duplicate ? '⚠️ _Duplicato — metadati aggiornati_\\n' : '') + '🔗 https://docs.mt-home.uk/documents/' + $json.id + '/details/' }}",
"additionalFields": {
"parse_mode": "Markdown"
}
},
"credentials": {
"telegramApi": {
"id": "uTXHLqcCJxbOvqN3",
"name": "Telegram account"
}
}
},
{
"id": "estrai-task-id",
"name": "Estrai Task ID",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2220,
-200
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Paperless post_document risponde con {data: \"uuid\"} (responseFormat: text → n8n wrappa in {data:...})\nconst raw = $input.first().json;\nconst task_id = raw.data || raw.body || String(raw);\nconst meta = $('Prepara Upload').first().json;\n\n// Parse tag_ids se arriva come stringa\nlet tag_ids = meta.tag_ids;\nif (typeof tag_ids === 'string') {\n try { tag_ids = JSON.parse(tag_ids); } catch(e) { tag_ids = []; }\n}\n\nreturn [{ json: { \n task_id: task_id.replace(/\"/g,'').trim(),\n ...meta,\n tag_ids\n}}];"
}
},
{
"id": "wait-paperless",
"name": "⏳ Attendi Paperless",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
2440,
-200
],
"parameters": {
"amount": 20,
"unit": "seconds"
},
"webhookId": "wait-paperless-bolletta"
},
{
"id": "get-task-status",
"name": "Paperless - Stato Task",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
2660,
-200
],
"parameters": {
"method": "GET",
"url": "https://docs.mt-home.uk/api/tasks/",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "task_id",
"value": "={{ $json.task_id }}"
}
]
},
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
},
{
"id": "estrai-doc-id",
"name": "Estrai Document ID",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2880,
-200
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "const tasks = $input.first().json;\nconst taskList = Array.isArray(tasks) ? tasks : [tasks];\nconst task = taskList[0];\nif (!task) throw new Error('Nessun task trovato');\n\nconst isDuplicate = task.status === 'FAILURE' && String(task.result || '').includes('duplicate');\nconst isSuccess = task.status === 'SUCCESS';\nif (!isSuccess && !isDuplicate) {\n throw new Error(`Task ${task.status}: ${task.result || task.task_error || ''}`);\n}\n\nconst doc_id = parseInt(String(task.related_document || '').replace(/\\D/g,''), 10);\nif (!doc_id) throw new Error('Document ID non trovato: ' + JSON.stringify(task));\n\nconst meta = $('Prepara Upload').first().json;\n\nlet tag_ids = meta.tag_ids;\nif (typeof tag_ids === 'string') {\n try { tag_ids = JSON.parse(tag_ids); } catch(e) { tag_ids = []; }\n}\n\n// created_date è già ISO completo (es: \"2026-03-18T21:26:51.000Z\"), prendi solo YYYY-MM-DD\nconst created_date = meta.created_date\n ? String(meta.created_date).substring(0, 10)\n : null;\n\nreturn [{ json: {\n doc_id,\n is_duplicate: isDuplicate,\n title: meta.title,\n correspondent_id: meta.correspondent_id != null ? Number(meta.correspondent_id) : null,\n document_type_id: meta.document_type_id != null ? Number(meta.document_type_id) : null,\n storage_path_id: meta.storage_path_id != null ? Number(meta.storage_path_id) : null,\n tag_ids: Array.isArray(tag_ids) ? tag_ids.map(Number).filter(n => !isNaN(n)) : [],\n created_date,\n}}];"
}
},
{
"id": "patch-doc-meta",
"name": "Paperless - Patch Metadati",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
3100,
-200
],
"parameters": {
"method": "PATCH",
"url": "=https://docs.mt-home.uk/api/documents/{{ $json.doc_id }}/",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ \n JSON.stringify(\n Object.fromEntries(\n Object.entries({\n correspondent: $json.correspondent_id,\n document_type: $json.document_type_id,\n storage_path: $json.storage_path_id,\n tags: $json.tag_ids && $json.tag_ids.length > 0 ? $json.tag_ids : undefined,\n created: $json.created_date || undefined\n }).filter(([_, v]) => v !== null && v !== undefined)\n )\n )\n}}",
"options": {}
},
"credentials": {
"httpHeaderAuth": {
"id": "uvGjLbrN5yQTQIzv",
"name": "Paperless-NGX API"
}
}
}
],
"connections": {
"📎 Webhook Bolletta": {
"main": [
[
{
"node": "Gmail - Leggi Messaggio",
"type": "main",
"index": 0
}
]
]
},
"Gmail - Leggi Messaggio": {
"main": [
[
{
"node": "Trova Allegato PDF",
"type": "main",
"index": 0
}
]
]
},
"Trova Allegato PDF": {
"main": [
[
{
"node": "Gmail - Download Allegato",
"type": "main",
"index": 0
}
]
]
},
"Gmail - Download Allegato": {
"main": [
[
{
"node": "Decodifica Allegato",
"type": "main",
"index": 0
}
]
]
},
"Decodifica Allegato": {
"main": [
[
{
"node": "Paperless - Corrispondenti",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Corrispondenti": {
"main": [
[
{
"node": "Paperless - Tipi Doc",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Tipi Doc": {
"main": [
[
{
"node": "Paperless - Tag",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Tag": {
"main": [
[
{
"node": "Paperless - Percorsi",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Percorsi": {
"main": [
[
{
"node": "Paperless - Cerca Simili",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Cerca Simili": {
"main": [
[
{
"node": "Build Prompt Inferenza",
"type": "main",
"index": 0
}
]
]
},
"Build Prompt Inferenza": {
"main": [
[
{
"node": "Ottieni Token Copilot",
"type": "main",
"index": 0
}
]
]
},
"Ottieni Token Copilot": {
"main": [
[
{
"node": "GPT-4.1 - Inferisci Metadati",
"type": "main",
"index": 0
}
]
]
},
"GPT-4.1 - Inferisci Metadati": {
"main": [
[
{
"node": "Parse Risposta GPT",
"type": "main",
"index": 0
}
]
]
},
"Parse Risposta GPT": {
"main": [
[
{
"node": "Prepara Upload",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Upload Documento": {
"main": [
[
{
"node": "Estrai Task ID",
"type": "main",
"index": 0
}
]
]
},
"Prepara Upload": {
"main": [
[
{
"node": "Paperless - Upload Documento",
"type": "main",
"index": 0
}
]
]
},
"Estrai Task ID": {
"main": [
[
{
"node": "⏳ Attendi Paperless",
"type": "main",
"index": 0
}
]
]
},
"⏳ Attendi Paperless": {
"main": [
[
{
"node": "Paperless - Stato Task",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Stato Task": {
"main": [
[
{
"node": "Estrai Document ID",
"type": "main",
"index": 0
}
]
]
},
"Estrai Document ID": {
"main": [
[
{
"node": "Paperless - Patch Metadati",
"type": "main",
"index": 0
}
]
]
},
"Paperless - Patch Metadati": {
"main": [
[
{
"node": "Telegram - Conferma Upload",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"callerPolicy": "workflowsFromSameOwner",
"availableInMCP": false
},
"triggerCount": 1,
"versionId": "cd5d2a62-eea4-419d-b65f-1b4bc134fd33",
"owner": {
"type": "personal",
"projectId": "Hdttz401OqqtObPo",
"projectName": "Martin Tahiraj <tahiraj.martin@gmail.com>",
"personalEmail": "tahiraj.martin@gmail.com"
},
"parentFolderId": null,
"isArchived": true
}