diff --git a/n8n/deployed/coordenador-glpi-v2.n8n.json b/n8n/deployed/coordenador-glpi-v2.n8n.json index cdaa57c..6fdcc35 100644 --- a/n8n/deployed/coordenador-glpi-v2.n8n.json +++ b/n8n/deployed/coordenador-glpi-v2.n8n.json @@ -850,6 +850,18 @@ "dataTableId": { "mode": "name", "value": "coordenador_glpi_envios_digest" + }, + "resource": "row", + "columns": { + "mappingMode": "defineBelow", + "value": { + "report_date": "={{ $json.report_date }}", + "run_type": "={{ $json.run_type }}", + "message_hash": "={{ $json.message_hash }}", + "sent_at": "={{ $json.sent_at }}", + "status": "={{ $json.status }}", + "error_detail": "={{ $json.error_detail }}" + } } } }, @@ -867,6 +879,18 @@ "dataTableId": { "mode": "name", "value": "coordenador_glpi_envios_digest" + }, + "resource": "row", + "columns": { + "mappingMode": "defineBelow", + "value": { + "report_date": "={{ $json.report_date }}", + "run_type": "={{ $json.run_type }}", + "message_hash": "={{ $json.message_hash }}", + "sent_at": "={{ $json.sent_at }}", + "status": "={{ $json.status }}", + "error_detail": "={{ $json.error_detail }}" + } } } }, diff --git a/n8n/workflow.template.json b/n8n/workflow.template.json index 6bd4d86..d01889f 100644 --- a/n8n/workflow.template.json +++ b/n8n/workflow.template.json @@ -850,6 +850,18 @@ "dataTableId": { "mode": "name", "value": "coordenador_glpi_envios_digest" + }, + "resource": "row", + "columns": { + "mappingMode": "defineBelow", + "value": { + "report_date": "={{ $json.report_date }}", + "run_type": "={{ $json.run_type }}", + "message_hash": "={{ $json.message_hash }}", + "sent_at": "={{ $json.sent_at }}", + "status": "={{ $json.status }}", + "error_detail": "={{ $json.error_detail }}" + } } } }, @@ -867,6 +879,18 @@ "dataTableId": { "mode": "name", "value": "coordenador_glpi_envios_digest" + }, + "resource": "row", + "columns": { + "mappingMode": "defineBelow", + "value": { + "report_date": "={{ $json.report_date }}", + "run_type": "={{ $json.run_type }}", + "message_hash": "={{ $json.message_hash }}", + "sent_at": "={{ $json.sent_at }}", + "status": "={{ $json.status }}", + "error_detail": "={{ $json.error_detail }}" + } } } }, diff --git a/tools/build-workflow.test.js b/tools/build-workflow.test.js index 1292e74..3b07dd9 100644 --- a/tools/build-workflow.test.js +++ b/tools/build-workflow.test.js @@ -181,6 +181,23 @@ test('nodes n8n-nodes-base.dataTable usam valores de operation validos (bug real } }); +test('todo node dataTable com operation insert/update/upsert tem columns.mappingMode definido (bug real: insert sem columns crasha no n8n com "Cannot convert undefined or null to object")', () => { + // Regressao: rodou de verdade contra o DEV -- os dois nodes novos "Data Table - Registrar + // Envio Digest (Sucesso/Falha)" tinham operation:"insert" e dataTableId, mas nenhum + // "columns" -- que e um campo OBRIGATORIO pra insert/update/upsert (ver get_node + // nodes-base.dataTable). Sem ele, o proprio node do n8n crasha dentro do proprio insert. + const wf = buildWorkflow(); + const OPERATIONS_REQUIRING_COLUMNS = new Set(['insert', 'update', 'upsert']); + for (const node of wf.nodes) { + if (node.type !== 'n8n-nodes-base.dataTable') continue; + if (!OPERATIONS_REQUIRING_COLUMNS.has(node.parameters.operation)) continue; + assert.ok( + node.parameters.columns && node.parameters.columns.mappingMode, + `node "${node.name}" tem operation="${node.parameters.operation}" mas nao tem columns.mappingMode -- vai crashar em runtime`, + ); + } +}); + test('registro de envio (per-ticket) so acontece depois do Data Table de sucesso do Slack -- nunca antes da confirmacao', () => { const wf = buildWorkflow(); // "Code - Selecionar Top 10" nao pode mais alimentar "Code - Preparar Registro de Envio" direto.