{
  "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
  }
}