The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Traduzir Dados da Obra e Preparar para Supabase",
"nodes": [
{
"parameters": {},
"name": "Start",
"type": "n8n-nodes-base.start",
"typeVersion": 1,
"position": [
250,
300
],
"id": "3f8a5dd4-2b0a-4b8c-a82c-04b7f8f8c0e1"
},
{
"parameters": {
"note": "Recebe o JSON da Obra Original como entrada para este workflow.\n\nPr\u00f3ximo Passo: N\u00f3 'Tradu\u00e7\u00f5es por Mapeamento e JSONB'"
},
"name": "Nota: Entrada da Obra",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
250,
100
],
"id": "a1b2c3d4-e5f6-7788-99a0-b1c2d3e4f5a6"
},
{
"parameters": {
"jsCode": "// Mapeamentos para tradu\u00e7\u00e3o (Exemplos - Adicione todos os necess\u00e1rios)\nconst industryCodeMap = {\n \"Food & Beverage\": \"Alimentos e Bebidas\",\n \"Chemicals\": \"Qu\u00edmicos\",\n \"Metals & Minerals\": \"Metais e Minerais\"\n};\nconst projectStatusMap = {\n \"Active\": \"Ativo\",\n \"Planned\": \"Planejado\",\n \"On Hold\": \"Em Espera\"\n};\nconst projectTypeMap = {\n \"Unit Addition\": \"Adi\u00e7\u00e3o de Unidade\",\n \"Plant Expansion\": \"Expans\u00e3o de Planta\",\n \"New Plant\": \"Nova Planta\"\n};\nconst plantStatusMap = {\n \"Operational\": \"Operacional\",\n \"Under Construction\": \"Em Constru\u00e7\u00e3o\"\n};\nconst pecActivityMap = {\n \"Project Scope\": \"Escopo do Projeto\",\n \"Engineering\": \"Engenharia\"\n};\nconst probabilityMap = {\n \"Medium (70-80%)\": \"M\u00e9dia (70-80%)\",\n \"High (>80%)\": \"Alta (>80%)\",\n \"Low (<60%)\": \"Baixa (<60%)\"\n};\nconst countryMap = {\n \"Brazil\": \"Brasil\",\n \"USA\": \"Estados Unidos\"\n};\nconst firmTypeMap = {\n \"Project Manager\": \"Gerente de Projeto\",\n \"Owner\": \"Propriet\u00e1rio\",\n \"Contractor\": \"Contratado\"\n};\nconst contactTitleMap = {\n \"Engineering Manager\": \"Gerente de Engenharia\",\n \"Plant Manager\": \"Gerente de Planta\",\n \"Project Manager\": \"Gerente de Projeto\"\n};\n\n// Fun\u00e7\u00e3o auxiliar para traduzir ou retornar original\nfunction translate(value, map) {\n return map[value] || value;\n}\n\n// Assumindo que $json cont\u00e9m o JSON da obra vindo do n\u00f3 anterior\nconst obra = $json;\n\n// 1. Tradu\u00e7\u00f5es de Campos de Primeiro N\u00edvel (usando mapeamento)\nobra.industryCodeDesc_pt = translate(obra.industryCodeDesc, industryCodeMap);\nobra.projectStatusDesc_pt = translate(obra.projectStatusDesc, projectStatusMap);\nobra.projectTypeDesc_pt = translate(obra.projectTypeDesc, projectTypeMap);\nobra.plantStatusDesc_pt = translate(obra.plantStatusDesc, plantStatusMap);\nobra.pecActivityDesc_pt = translate(obra.pecActivityDesc, pecActivityMap);\nobra.projectProbability_pt = translate(obra.projectProbability, probabilityMap);\n\n// (tradingRegionName, marketRegionName, worldRegionName podem precisar de mapeamentos tamb\u00e9m)\nobra.tradingRegionName_pt = obra.tradingRegionName; // Placeholder\nobra.marketRegionName_pt = obra.marketRegionName; // Placeholder\nobra.worldRegionName_pt = obra.worldRegionName; // Placeholder\n\n// 2. Preparar campos para tradu\u00e7\u00e3o via API (ser\u00e3o preenchidos ap\u00f3s simula\u00e7\u00e3o de API)\n// Apenas um exemplo, voc\u00ea faria isso para todos os campos de texto livre relevantes\n// Os n\u00f3s HTTP Request subsequentes simular\u00e3o a tradu\u00e7\u00e3o destes.\n\n// 3. Tradu\u00e7\u00f5es dentro de JSONB\n// 3.1. plantPhysicalAddress (Objeto JSONB)\nif (obra.plantPhysicalAddress) {\n obra.plantPhysicalAddress.countryName_pt = translate(obra.plantPhysicalAddress.countryName, countryMap);\n // Adicionar countyName_pt, stateName_pt se necess\u00e1rio, ap\u00f3s tradu\u00e7\u00e3o por API ou mapeamento\n // obra.plantPhysicalAddress.countyName_pt = await traduzirComAPI(obra.plantPhysicalAddress.countyName); (Conceitual)\n}\n\n// 3.2. projectSectors (Array de Objetos em JSONB)\nif (obra.projectSectors && Array.isArray(obra.projectSectors)) {\n obra.projectSectors.forEach(sector => {\n sector.projectSectorDesc_pt = translate(sector.projectSectorDesc, {}); // Adicione um mapa para projectSectorDesc se aplic\u00e1vel\n });\n}\n\n// 3.3. plantSectors (Array de Objetos em JSONB)\nif (obra.plantSectors && Array.isArray(obra.plantSectors)) {\n obra.plantSectors.forEach(sector => {\n sector.plantSectorDesc_pt = translate(sector.plantSectorDesc, {}); // Adicione um mapa para plantSectorDesc se aplic\u00e1vel\n });\n}\n\n// 3.4. projectCompanies (Array de Objetos em JSONB)\nif (obra.projectCompanies && Array.isArray(obra.projectCompanies)) {\n obra.projectCompanies.forEach(company => {\n company.firmTypeDesc_pt = translate(company.firmTypeDesc, firmTypeMap);\n if (company.projectContact) {\n company.projectContact.titleDesc_pt = translate(company.projectContact.titleDesc, contactTitleMap);\n }\n });\n}\n\n// Retorna a obra modificada para o pr\u00f3ximo n\u00f3\nreturn obra;\n"
},
"name": "Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
500,
300
],
"id": "b4c5d6e7-f8g9-1011-1213-h1i2j3k4l5m6"
},
{
"parameters": {
"note": "Este n\u00f3 aplica tradu\u00e7\u00f5es para campos com valores predefinidos (usando mapeamentos internos) e inicia a modifica\u00e7\u00e3o dos campos JSONB.\n\nCampos de texto livre como 'projectName', 'scope', 'schedule', 'projectSicDesc' etc., ser\u00e3o \"traduzidos\" nos pr\u00f3ximos n\u00f3s (simula\u00e7\u00e3o de API).\n\nPr\u00f3ximo Passo: Simula\u00e7\u00e3o de Tradu\u00e7\u00e3o de 'projectName'"
},
"name": "Nota: L\u00f3gica de Tradu\u00e7\u00e3o Fixa",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
500,
100
],
"id": "c5d6e7f8-g9h0-1112-1314-i2j3k4l5m6n7"
},
{
"parameters": {
"url": "https://jsonplaceholder.typicode.com/todos/1",
"options": {},
"bodyParameters": "={{ { 'text_to_translate': $json.projectName } }}",
"headerParameters": "={{ { 'Content-Type': 'application/json' } }}",
"method": "POST",
"authentication": "none",
"jsonParameters": true,
"jsonBody": true
},
"name": "Simular Tradu\u00e7\u00e3o API: projectName",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
750,
150
],
"id": "d6e7f8g9-h0i1-2233-4455-j3k4l5m6n7o8"
},
{
"parameters": {
"url": "https://jsonplaceholder.typicode.com/todos/2",
"options": {},
"bodyParameters": "={{ { 'text_to_translate': $json.scope } }}",
"headerParameters": "={{ { 'Content-Type': 'application/json' } }}",
"method": "POST",
"authentication": "none",
"jsonParameters": true,
"jsonBody": true
},
"name": "Simular Tradu\u00e7\u00e3o API: scope",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
750,
300
],
"id": "e7f8g9h0-i1j2-3344-5566-k4l5m6n7o8p9"
},
{
"parameters": {
"url": "https://jsonplaceholder.typicode.com/todos/3",
"options": {},
"bodyParameters": "={{ { 'text_to_translate': $json.schedule } }}",
"headerParameters": "={{ { 'Content-Type': 'application/json' } }}",
"method": "POST",
"authentication": "none",
"jsonParameters": true,
"jsonBody": true
},
"name": "Simular Tradu\u00e7\u00e3o API: schedule",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
750,
450
],
"id": "f8g9h0i1-j2k3-4455-6677-l5m6n7o8p9q0"
},
{
"parameters": {
"note": "Estes n\u00f3s HTTP Request SIMULAM chamadas a uma API de tradu\u00e7\u00e3o.\nNa pr\u00e1tica, voc\u00ea os substituiria por chamadas reais \u00e0 sua API de tradu\u00e7\u00e3o escolhida (Google Translate, DeepL, etc.).\n\nEles est\u00e3o configurados para enviar o texto original no corpo da requisi\u00e7\u00e3o e, para este exemplo, a resposta da API (jsonplaceholder) ser\u00e1 ignorada, e o n\u00f3 'Consolidar Tradu\u00e7\u00f5es' pegar\u00e1 o texto original e o prefixar\u00e1.\n\nPr\u00f3ximo Passo: N\u00f3 'Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB'"
},
"name": "Nota: Simula\u00e7\u00e3o API Tradu\u00e7\u00e3o",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
750,
0
],
"id": "g9h0i1j2-k3l4-5566-7788-m6n7o8p9q0r1"
},
{
"parameters": {
"jsCode": "// Obter o resultado do n\u00f3 de mapeamento (que j\u00e1 tem algumas tradu\u00e7\u00f5es _pt)\n// $items(\"Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)\")[0].json;\nconst obra = $items(0)[0].json; // assume que o n\u00f3 'Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)' \u00e9 o primeiro input n\u00e3o-start\n\n// Simula\u00e7\u00e3o da obten\u00e7\u00e3o de resultados da API de tradu\u00e7\u00e3o\n// Na pr\u00e1tica, voc\u00ea pegaria $items(\"Simular Tradu\u00e7\u00e3o API: projectName\")[0].json.body ou similar\n// Para este exemplo, vamos pegar o valor original e prefixar.\n\n// Pegando os textos originais enviados para as \"APIs\"\nconst originalProjectName = $items(\"Simular Tradu\u00e7\u00e3o API: projectName\")[0].json.json.text_to_translate;\nconst originalScope = $items(\"Simular Tradu\u00e7\u00e3o API: scope\")[0].json.json.text_to_translate;\nconst originalSchedule = $items(\"Simular Tradu\u00e7\u00e3o API: schedule\")[0].json.json.text_to_translate;\n// Adicione aqui outros campos que foram \"traduzidos\" por API\nconst originalProjectSicDesc = obra.projectSicDesc; // Supondo que este tamb\u00e9m iria para API\nconst originalSicProductDesc = obra.sicProductDesc; // Supondo que este tamb\u00e9m iria para API\n\n// Aplicar tradu\u00e7\u00f5es \"simuladas\" da API\nobra.projectName_pt = \"[TRADUZIDO] \" + originalProjectName;\nobra.scope_pt = \"[TRADUZIDO] \" + originalScope;\nobra.schedule_pt = \"[TRADUZIDO] \" + originalSchedule;\nobra.projectSicDesc_pt = \"[TRADUZIDO] \" + originalProjectSicDesc;\nobra.sicProductDesc_pt = \"[TRADUZIDO] \" + originalSicProductDesc;\n\n// Exemplo de como voc\u00ea poderia lidar com a tradu\u00e7\u00e3o de countyName dentro de plantPhysicalAddress\n// se ele tamb\u00e9m viesse de uma API simulada. \n// Suponha que houve um n\u00f3 HTTP para countyName:\n// const originalCountyName = $items(\"Simular Tradu\u00e7\u00e3o API: countyName\")[0].json.json.text_to_translate;\nif (obra.plantPhysicalAddress) {\n // obra.plantPhysicalAddress.countyName_pt = \"[TRADUZIDO] \" + obra.plantPhysicalAddress.countyName;\n // Voc\u00ea precisaria de um n\u00f3 HTTP para cada campo de texto livre ou um loop.\n // Por simplicidade, se countyName tiver um mapa, use-o. Se n\u00e3o, deixe como est\u00e1 ou use API.\n // Se o countyName for sempre 'Minas Gerais' para o Brasil, o mapeamento inicial j\u00e1 o teria tratado.\n}\n\n// Adicionar quaisquer outras l\u00f3gicas de finaliza\u00e7\u00e3o se necess\u00e1rio.\n\nreturn obra;\n"
},
"name": "Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [
1000,
300
],
"id": "h0i1j2k3-l4m5-6677-8899-n7o8p9q0r1s2",
"inputs": {
"main": [
[
{
"node": "Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)",
"output": "main"
}
]
]
},
"additionalFields": {
"inputs": {
"input_0": {
"name": "main",
"connections": [
{
"node": "Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)",
"output": "main"
}
]
},
"input_1": {
"name": "api_projectName",
"connections": [
{
"node": "Simular Tradu\u00e7\u00e3o API: projectName",
"output": "main"
}
]
},
"input_2": {
"name": "api_scope",
"connections": [
{
"node": "Simular Tradu\u00e7\u00e3o API: scope",
"output": "main"
}
]
},
"input_3": {
"name": "api_schedule",
"connections": [
{
"node": "Simular Tradu\u00e7\u00e3o API: schedule",
"output": "main"
}
]
}
}
}
},
{
"parameters": {
"note": "Este n\u00f3 coleta os resultados das tradu\u00e7\u00f5es (mapeadas e simuladas via API) e finaliza a estrutura do objeto da obra com todos os campos _pt.\n\nO objeto JSON resultante est\u00e1 pronto para ser enviado ao Supabase (ou qualquer outro destino).\n\nPr\u00f3ximo Passo: (Fim do Workflow ou N\u00f3 de Sa\u00edda/Supabase)"
},
"name": "Nota: Objeto Final da Obra",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1000,
100
],
"id": "i1j2k3l4-m5n6-7788-9900-o8p9q0r1s2t3"
},
{
"parameters": {},
"name": "Fim (Dados Prontos)",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
1250,
300
],
"id": "j2k3l4m5-n6o7-8899-0011-p9q0r1s2t3u4"
}
],
"connections": {
"Start": {
"main": [
[
{
"node": "Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)",
"output": "main"
}
]
]
},
"Tradu\u00e7\u00f5es por Mapeamento e JSONB (Parte 1)": {
"main": [
[
{
"node": "Simular Tradu\u00e7\u00e3o API: projectName",
"output": "main"
}
],
[
{
"node": "Simular Tradu\u00e7\u00e3o API: scope",
"output": "main"
}
],
[
{
"node": "Simular Tradu\u00e7\u00e3o API: schedule",
"output": "main"
}
],
[
{
"node": "Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB",
"output": "main"
}
]
]
},
"Simular Tradu\u00e7\u00e3o API: projectName": {
"main": [
[
{
"node": "Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB",
"output": "main"
}
]
]
},
"Simular Tradu\u00e7\u00e3o API: scope": {
"main": [
[
{
"node": "Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB",
"output": "main"
}
]
]
},
"Simular Tradu\u00e7\u00e3o API: schedule": {
"main": [
[
{
"node": "Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB",
"output": "main"
}
]
]
},
"Consolidar Tradu\u00e7\u00f5es e Finalizar JSONB": {
"main": [
[
{
"node": "Fim (Dados Prontos)",
"output": "main"
}
]
]
}
},
"settings": {},
"staticData": null,
"meta": {
"templateCredsSetupCompleted": true
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Traduzir Dados da Obra e Preparar para Supabase. Uses start, httpRequest. Manual trigger; 11 nodes.
Source: https://github.com/YuriFAToledo/axion/blob/e55bd4075ab546fb992dd26091137219097decdb/database/n8n.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
My Workflow. Uses start, mongoDb, httpRequest, localFileTrigger. Event-driven trigger; 7 nodes.
Postgres: insert update executeQuery. Uses start, postgres. Manual trigger; 7 nodes.
BTC_Poll. Uses start, httpRequest, postgres. Scheduled trigger; 5 nodes.
BP_check. Uses googleSheets, @n-octo-n/n8n-nodes-json-database, httpRequest, itemLists. Webhook trigger; 99 nodes.
v25.1.3. Uses httpRequest, mySql, n8n-nodes-zohozeptomail. Webhook trigger; 98 nodes.