{
  "name": "killBottleneck — stav 8D zpět do tabulky",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 10
            }
          ]
        }
      },
      "id": "44444444-4444-4444-8444-444444444444",
      "name": "Každých 10 minut",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "url": "https://vasefirma.killbottleneck.com/api/kb/v1/maps/sem_vlozte_id_mapy",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer kb_user_sem_vlozte_svuj_klic"
            }
          ]
        },
        "options": {}
      },
      "id": "55555555-5555-4555-8555-555555555555",
      "name": "Načti mapu",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Z mapy udělá seznam „karta → jak daleko je 8D\", který se pak nalije do tabulky.\n// ⚙️ VYPLŇTE DVA ŘÁDKY — stejné jako v prvním postupu:\nconst KB_VETEV  = 'Nové reklamace'; // kanbanová nástěnka: 'D1 – Sestavení týmu'\nconst KB_KANBAN = false;            // kanbanová nástěnka? dejte true\n\n/** Rejstřík uzlů: u každého rodič a řada, ve které stojí rodič (u kanbanu = sloupce). */\nfunction rejstrik(strom) {\n  const vse = {};\n  const projdi = (uzly, rodic, radaRodice) => {\n    (uzly || []).forEach((u) => {\n      vse[u.id] = { uzel: u, rodic, radaRodice };\n      projdi(u.children, u, uzly);\n    });\n  };\n  projdi(strom, null, []);\n  return vse;\n}\n\n/** Jedna věta do tabulky — sloupec (kanban), nebo hotové podcíle (klasická mapa). */\nfunction popisPokroku(zaznam) {\n  if (KB_KANBAN) {\n    const sloupce = zaznam.radaRodice || [];\n    const poradi = sloupce.indexOf(zaznam.rodic) + 1;\n    if (!poradi) return 'není pod žádným sloupcem';\n    if (poradi === sloupce.length && zaznam.uzel.status === 'done') return '✅ uzavřeno (' + poradi + '/' + sloupce.length + ')';\n    return zaznam.rodic.title + ' (' + poradi + '/' + sloupce.length + ')';\n  }\n  const kroky = zaznam.uzel.children || [];\n  if (!kroky.length) return zaznam.uzel.status === 'done' ? 'uzavřeno' : 'čeká na rozbalení 8D';\n  const hotovo = kroky.filter((k) => k.status === 'done').length;\n  if (hotovo === kroky.length) return '✅ uzavřeno (' + hotovo + '/' + kroky.length + ')';\n  return kroky.filter((k) => k.status !== 'done')[0].title + ' (' + hotovo + '/' + kroky.length + ')';\n}\n\nconst mapa = $input.first().json;\nconst vse = rejstrik(mapa.tree);\n\nconst vstup = Object.values(vse).filter((z) => z.uzel.title === KB_VETEV)[0];\nif (!vstup) throw new Error('V mapě chybí cíl „' + KB_VETEV + '\".');\n\n// Klasická mapa: karty visí pod jedním cílem. Kanban: jsou rozeseté po všech sloupcích\n// řady, ve které stojí i ten první — proto se berou sourozenci vstupního uzlu.\nconst sloupce = KB_KANBAN ? (vstup.rodic ? vstup.rodic.children || [] : [vstup.uzel]) : [vstup.uzel];\nconst karty = sloupce.reduce((acc, s) => acc.concat(s.children || []), []);\n\nreturn karty.map((karta) => ({\n  json: {\n    killBottleneck: karta.id,\n    'Stav 8D': popisPokroku(vse[karta.id]),\n  },\n}));"
      },
      "id": "66666666-6666-4666-8666-666666666666",
      "name": "Spočítej pokrok",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        440,
        0
      ]
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "SEM_ID_TABULKY",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Reklamace"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "killBottleneck"
          ],
          "value": {}
        },
        "options": {}
      },
      "id": "77777777-7777-4777-8777-777777777777",
      "name": "Aktualizuj řádky v tabulce",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        660,
        0
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "SEM_ID_PRIHLASENI",
          "name": "Google Sheets"
        }
      }
    }
  ],
  "connections": {
    "Každých 10 minut": {
      "main": [
        [
          {
            "node": "Načti mapu",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Načti mapu": {
      "main": [
        [
          {
            "node": "Spočítej pokrok",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Spočítej pokrok": {
      "main": [
        [
          {
            "node": "Aktualizuj řádky v tabulce",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}
