// templates-data.jsx — 3-рівнева система шаблонів
// Шаблон проєкту → містить → шаблони етапів → містять → шаблони задач (атомарні)
//
// ПРИМІТКА: обгортаємо в IIFE, бо data.jsx має старий `const TASK_TEMPLATES` —
// прямі const-и колізуватимуть у глобальному скоупі класичних <script>.
(function () {

// ===================================================================
// АТОМАРНІ ШАБЛОНИ ЗАДАЧ
// ===================================================================
const TASK_TEMPLATES = [
  // === Ініціація / наскрізні (застосовуються до проєктів за правилом appliesTo) ===
  { id: "tt-assign-gip", title: "Призначити ГІПа / ГАПа",
    icon: "👔", section: "ГІП", assigneeRole: "gip",
    estDays: 1, deadlineOffset: 1, isBaseline: true,
    description: "Визначити відповідального керівника проєкту. Залежно від характеру об'єкта — ГІП, ГАП або обидва. Умова завершення: призначено щонайменше одного.",
    completionRule: "Призначено мінімум одного з: ГІП, ГАП",
    subtasks: [
      { title: "Визначити ГІПа (інженерний напрям)" },
      { title: "Визначити ГАПа (архітектурний напрям) — за потреби" },
      { title: "Перевірити чинність кваліфсертифіката під клас об'єкта" },
    ],
  },
  { id: "tt-consequence-class", title: "Розрахунок класу наслідків",
    icon: "🏷", section: "ГІП", assigneeRole: "gip",
    estDays: 2, deadlineOffset: 3, isBaseline: true,
    description: "Уточнити клас наслідків (СС1/СС2/СС3) розрахунком за ДБН А.2.2-3 / ДБН В.1.2-14. Попередній клас бере з Завдання на проєктування; розрахунок може його змінити в обидва боки. Результат керує обсягом експертизи.",
    completionRule: "Внесено уточнений клас наслідків + підстава",
    subtasks: [
      { title: "Зібрати вихідні дані (кількість людей, висота, прольоти, небезпеки)" },
      { title: "Розрахунок можливих наслідків за ДБН" },
      { title: "Внести уточнений клас в картку об'єкта" },
    ],
  },

  // === Вишукування (ВД) ===
  { id: "tt-geo-survey", title: "Геодезичні вишукування",
    icon: "📐", section: "ВД", assigneeRole: "geodesist",
    estDays: 5, deadlineOffset: 5, requiresSiteVisit: true,
    description: "Топогеодезичні вишукування на майданчику замовника. Як правило — підрядна організація.",
    subtasks: [
      { title: "Узгодити склад робіт з підрядником" },
      { title: "Виїзд бригади на майданчик" },
      { title: "Камеральна обробка" },
      { title: "Отримання звіту і креслень" },
    ],
    attachments: [
      { name: "ТЗ на геодезію", type: "form" },
      { name: "Звіт геодезії (.pdf + .dwg)", type: "report" },
    ],
  },
  { id: "tt-geol-survey", title: "Геологічні вишукування",
    icon: "🪨", section: "ВД", assigneeRole: "geologist",
    estDays: 10, deadlineOffset: 12, requiresSiteVisit: true,
    description: "Інженерно-геологічні вишукування. Замовляються в підрядника.",
    subtasks: [
      { title: "Узгодити обсяг свердловин" },
      { title: "Буріння свердловин" },
      { title: "Лабораторні дослідження" },
      { title: "Звіт з рекомендаціями" },
    ],
    attachments: [{ name: "ТЗ на геологію", type: "form" }, { name: "Звіт геології", type: "report" }],
  },

  // === Технічне обстеження (для реконструкції) ===
  { id: "tt-to-inspection", title: "Технічне обстеження конструкцій",
    icon: "🔍", section: "ТО", assigneeRole: "constructor",
    estDays: 15, deadlineOffset: 15, requiresSiteVisit: true,
    description: "Обстеження існуючих несучих конструкцій для визначення можливості реконструкції.",
    subtasks: [
      { title: "Візуальне обстеження" },
      { title: "Інструментальне обстеження" },
      { title: "Розкриття вузлів за потреби" },
      { title: "Звіт ТО з висновками" },
    ],
    attachments: [{ name: "Звіт ТО", type: "report" }],
  },
  { id: "tt-defect-act", title: "Відомість дефектів (дефектний акт)",
    icon: "📋", section: "ТО", assigneeRole: "constructor",
    estDays: 5, deadlineOffset: 7, requiresSiteVisit: true,
    description: "Огляд об'єкта, фіксація дефектів і обсягів робіт — підстава для капітального ремонту.",
    subtasks: [
      { title: "Натурний огляд" },
      { title: "Обмірні роботи" },
      { title: "Складання відомості дефектів" },
    ],
    attachments: [{ name: "Відомість дефектів", type: "report" }],
  },

  // === Технологічна частина (для виробничих об'єктів) ===
  { id: "tt-th-section", title: "Технологічна частина (ТХ)",
    icon: "⚙️", section: "ТХ", assigneeRole: "technologist",
    estDays: 14, deadlineOffset: 35,
    description: "Технологічні рішення виробництва: розстановка обладнання, потоки, шкідливості, спецвимоги до інженерних систем.",
    subtasks: [
      { title: "Технологічна схема" },
      { title: "Специфікація обладнання" },
      { title: "Завдання суміжникам (ОВ/ВК/ЕО)" },
    ],
  },

  // === Реставрація / культурна спадщина ===
  { id: "tt-resto-research", title: "Історико-архітектурні дослідження",
    icon: "🏺", section: "РД", assigneeRole: "architect",
    estDays: 20, deadlineOffset: 20, requiresSiteVisit: true,
    description: "Натурні та архівні дослідження пам'ятки: іконографія, зондажі, історична довідка.",
    subtasks: [
      { title: "Архівно-бібліографічний пошук" },
      { title: "Натурні дослідження і зондажі" },
      { title: "Історична довідка" },
    ],
    attachments: [{ name: "Звіт історико-арх. досліджень", type: "report" }],
  },
  { id: "tt-resto-heritage-approval", title: "Погодження органу охорони спадщини",
    icon: "🏛", section: "ГІП", assigneeRole: "gip",
    estDays: 15, deadlineOffset: 60,
    description: "Погодження реставраційного завдання та проєкту з органом охорони культурної спадщини.",
    attachments: [{ name: "Погодження органу охорони спадщини", type: "report" }],
  },

  // === Схема намірів / садибна забудова ===
  { id: "tt-schema-intent", title: "Схема намірів забудови",
    icon: "🗺", section: "АР", assigneeRole: "architect",
    estDays: 4, deadlineOffset: 5,
    description: "Схема намірів забудови ділянки для будинку садибного типу / блокованої забудови.",
    subtasks: [
      { title: "Ситуаційна схема" },
      { title: "Розміщення будинку на ділянці" },
      { title: "Узгодження з замовником" },
    ],
  },
  { id: "tt-build-passport", title: "Будівельний паспорт забудови",
    icon: "📗", section: "АР", assigneeRole: "architect",
    estDays: 6, deadlineOffset: 12,
    description: "Оформлення будівельного паспорта забудови земельної ділянки (без експертизи).",
    dependencies: ["tt-schema-intent"],
    attachments: [{ name: "Будівельний паспорт", type: "report" }],
  },
  { id: "tt-notification-start", title: "Повідомлення про початок робіт",
    icon: "📨", section: "ГІП", assigneeRole: "gip",
    estDays: 1, deadlineOffset: 14,
    description: "Подача повідомлення про початок будівельних робіт (для об'єктів СС1 / садибної забудови).",
  },

  // === АР ===
  { id: "tt-ar-concept", title: "Архітектурна концепція",
    icon: "✏️", section: "АР", assigneeRole: "architect",
    estDays: 10, deadlineOffset: 10,
    description: "Об'ємно-планувальне рішення. Узгоджується з замовником до старту робочих креслень.",
    subtasks: [
      { title: "Ескізи планів" },
      { title: "3D-візуалізації" },
      { title: "Презентація замовнику" },
      { title: "Узгодження ТЗ" },
    ],
  },
  { id: "tt-ar-section", title: "Архітектурне рішення (АР)",
    icon: "📐", section: "АР", assigneeRole: "architect",
    estDays: 20, deadlineOffset: 30,
    description: "Повний розділ АР: плани, фасади, розрізи, вузли.",
    dependencies: ["tt-ar-concept"],
  },
  { id: "tt-ar-landscape", title: "Благоустрій території",
    icon: "🌳", section: "АР", assigneeRole: "architect",
    estDays: 10, deadlineOffset: 30,
    description: "Генплан, дорожнє покриття, озеленення, малі форми.",
  },
  { id: "tt-ar-playground", title: "Дитячі майданчики",
    icon: "🛝", section: "АР", assigneeRole: "architect",
    estDays: 5, deadlineOffset: 35,
    description: "Проєктування ігрових і спортивних майданчиків.",
  },
  { id: "tt-ar-parking", title: "Паркінг",
    icon: "🅿️", section: "АР", assigneeRole: "architect",
    estDays: 10, deadlineOffset: 35,
    description: "Підземний/наземний паркінг.",
  },

  // === КЖ ===
  { id: "tt-kj-foundation", title: "Розрахунок фундаментів",
    icon: "🧱", section: "КЖ", assigneeRole: "constructor",
    estDays: 8, deadlineOffset: 20,
    description: "Розрахунок основ і фундаментів з урахуванням геології.",
    dependencies: ["tt-geol-survey"],
  },
  { id: "tt-kj-slabs", title: "Розрахунок плит перекриття",
    icon: "🧮", section: "КЖ", assigneeRole: "constructor",
    estDays: 10, deadlineOffset: 30,
    description: "Збір навантажень, армування, перевірка прогинів.",
  },
  { id: "tt-kj-walls", title: "Розрахунок несучого каркасу",
    icon: "🏗", section: "КЖ", assigneeRole: "constructor",
    estDays: 12, deadlineOffset: 35,
    description: "Стіни, колони, з'єднання. ЛІРА/SCAD.",
  },
  { id: "tt-kj-drawings", title: "КЖ креслення",
    icon: "📄", section: "КЖ", assigneeRole: "constructor",
    estDays: 15, deadlineOffset: 50,
    description: "Робочі креслення розділу КЖ.",
    dependencies: ["tt-kj-foundation", "tt-kj-slabs", "tt-kj-walls"],
  },
  { id: "tt-kj-reinforcement", title: "Конструктивне підсилення",
    icon: "🔧", section: "КЖ", assigneeRole: "constructor",
    estDays: 20, deadlineOffset: 30,
    description: "Розрахунок і деталі підсилення (для реконструкції).",
    dependencies: ["tt-to-inspection"],
  },

  // === ОВ ===
  { id: "tt-ov-section", title: "Розділ ОВ (опалення-вентиляція)",
    icon: "🌬", section: "ОВ", assigneeRole: "engineer-ovk",
    estDays: 10, deadlineOffset: 40,
    description: "Опалення, припливно-витяжна вентиляція, кондиціонування.",
  },
  { id: "tt-ov-kitchen", title: "Розрахунок вентиляції харчоблоку",
    icon: "🍽", section: "ОВ", assigneeRole: "engineer-ovk",
    estDays: 3, deadlineOffset: 45,
    description: "Спеціалізована витяжна вентиляція для кухні.",
  },

  // === ВК ===
  { id: "tt-vk-section", title: "Розділ ВК (водопостач.-каналізація)",
    icon: "💧", section: "ВК", assigneeRole: "engineer-ovk",
    estDays: 8, deadlineOffset: 40,
    description: "ХВ, ГВ, господарська і дощова каналізація.",
  },

  // === ЕО ===
  { id: "tt-eo-section", title: "Розділ ЕО (електрика)",
    icon: "⚡️", section: "ЕО", assigneeRole: "electrician",
    estDays: 10, deadlineOffset: 40,
    description: "Силове електропостачання, освітлення, заземлення.",
  },
  { id: "tt-ss-section", title: "Слабкострумові системи",
    icon: "📡", section: "СС", assigneeRole: "electrician",
    estDays: 5, deadlineOffset: 45,
    description: "СКС, охорона, відеоспостереження, СПС.",
  },

  // === ПБ ===
  { id: "tt-pb-section", title: "Пожежна безпека",
    icon: "🔥", section: "ПБ", assigneeRole: "gip",
    estDays: 5, deadlineOffset: 50,
    description: "Розділ ПБ: евакуація, СПС, протипожежні відстані.",
  },

  // === Інженерні мережі (зовнішні) ===
  { id: "tt-engineering-networks", title: "Зовнішні інженерні мережі",
    icon: "🔌", section: "ІМ", assigneeRole: "engineer-ovk",
    estDays: 20, deadlineOffset: 55,
    description: "Підключення до зовнішніх мереж: ХВ, КК, ТМ, ЕП, газ.",
  },

  // === Кошторис (ТД) ===
  { id: "tt-est-prices", title: "Збір цін на матеріали",
    icon: "💰", section: "ТД", assigneeRole: "estimator",
    estDays: 5, deadlineOffset: 5,
    description: "Запити постачальникам, актуалізація бази матеріалів.",
  },
  { id: "tt-est-main", title: "Кошторисна частина",
    icon: "📊", section: "ТД", assigneeRole: "estimator",
    estDays: 10, deadlineOffset: 12,
    description: "Локальні кошториси по розділах.",
    dependencies: ["tt-est-prices"],
  },
  { id: "tt-est-summary", title: "Зведений кошторис",
    icon: "📑", section: "ТД", assigneeRole: "estimator",
    estDays: 3, deadlineOffset: 15,
    description: "Зведений кошторис з підсумками і ПДВ.",
    dependencies: ["tt-est-main"],
    attachments: [{ name: "Зведений кошторис.xlsx", type: "report" }],
  },

  // === Експертиза (ГІП) ===
  { id: "tt-exp-prepare", title: "Підготовка пакету до експертизи",
    icon: "📦", section: "ГІП", assigneeRole: "gip",
    estDays: 5, deadlineOffset: 5,
    description: "Збірка повного комплекту, перевірка на відповідність ДБН.",
    subtasks: [
      { title: "Чек-лист повноти" },
      { title: "Заявка на експертизу" },
      { title: "Підпис ГІПа на ТЧ" },
    ],
  },
  { id: "tt-exp-submit", title: "Перша подача експертизи",
    icon: "📤", section: "ГІП", assigneeRole: "gip",
    estDays: 1, deadlineOffset: 6,
    dependencies: ["tt-exp-prepare"],
    description: "Реєстрація пакету в експертній організації.",
  },
  { id: "tt-exp-fixes", title: "Виправлення зауважень",
    icon: "✏️", section: "ГІП", assigneeRole: "gip",
    estDays: 10, deadlineOffset: 25,
    description: "Робота з протоколом зауважень експертизи.",
    dependencies: ["tt-exp-submit"],
  },
  { id: "tt-exp-conclusion", title: "Отримання експертного висновку",
    icon: "✅", section: "ГІП", assigneeRole: "gip",
    estDays: 0.5, deadlineOffset: 30,
    dependencies: ["tt-exp-fixes"],
    description: "Отримання позитивного висновку експертизи.",
    attachments: [{ name: "Експертний висновок", type: "report" }],
  },

  // === ЄДЕССБ (ГІП) ===
  { id: "tt-edessb-prepare", title: "Підготовка пакету до ЄДЕССБ",
    icon: "📦", section: "ГІП", assigneeRole: "gip",
    estDays: 2, deadlineOffset: 2,
    description: "Збірка пакету для електронного реєстру.",
  },
  { id: "tt-edessb-kep", title: "Підпис КЕП всіх авторів",
    icon: "🔐", section: "ГІП", assigneeRole: "gip",
    estDays: 1, deadlineOffset: 3,
    description: "Збір електронних підписів усіх авторів розділів.",
    dependencies: ["tt-edessb-prepare"],
  },
  { id: "tt-edessb-submit", title: "Подача через кабінет ЄДЕССБ",
    icon: "📤", section: "ГІП", assigneeRole: "gip",
    estDays: 0.3, deadlineOffset: 4,
    description: "Подача пакету в електронний кабінет.",
    dependencies: ["tt-edessb-kep"],
  },
  { id: "tt-edessb-fee", title: "Сплата збору ЄДЕССБ",
    icon: "💳", section: "ГІП", assigneeRole: "accountant",
    estDays: 0.2, deadlineOffset: 4,
    description: "Сплата державного збору.",
  },
  { id: "tt-edessb-receipt", title: "Отримання реєстраційної квитанції",
    icon: "🧾", section: "ГІП", assigneeRole: "gip",
    estDays: 5, deadlineOffset: 9,
    description: "Очікування реєстрації і отримання квитанції.",
    dependencies: ["tt-edessb-submit", "tt-edessb-fee"],
    attachments: [{ name: "Реєстраційна квитанція", type: "report" }],
  },

  // === АН (авторський нагляд) ===
  { id: "tt-an-visit", title: "Виїзд на майданчик",
    icon: "🚗", section: "АН", assigneeRole: "gip",
    estDays: 0.5, deadlineOffset: 0, requiresSiteVisit: true,
    description: "Плановий виїзд для АН.",
  },
  { id: "tt-an-check-nodes", title: "Перевірка вузлів виконання",
    icon: "🔍", section: "АН", assigneeRole: "constructor",
    estDays: 0.5, deadlineOffset: 0, requiresSiteVisit: true,
    description: "Контроль виконання критичних вузлів.",
  },
  { id: "tt-an-journal", title: "Запис у журнал АН",
    icon: "📓", section: "АН", assigneeRole: "gip",
    estDays: 0.3, deadlineOffset: 0,
    description: "Внесення записів у журнал авторського нагляду.",
    attachments: [{ name: "Журнал АН", type: "form" }],
  },
  { id: "tt-an-photos", title: "Фотофіксація",
    icon: "📷", section: "АН", assigneeRole: "constructor",
    estDays: 0.2, deadlineOffset: 0, requiresSiteVisit: true,
    description: "Фотофіксація виконаних робіт.",
  },
  { id: "tt-an-report", title: "Звіт замовнику",
    icon: "📨", section: "АН", assigneeRole: "gip",
    estDays: 0.5, deadlineOffset: 1,
    description: "Підсумковий звіт за період АН.",
    dependencies: ["tt-an-visit", "tt-an-photos", "tt-an-journal"],
    attachments: [{ name: "Звіт АН", type: "report" }],
  },
  { id: "tt-an-letter", title: "Авторський лист",
    icon: "✉️", section: "АН", assigneeRole: "gip",
    estDays: 0.5, deadlineOffset: 1,
    description: "Лист про допуск/недопуск, зміни в проєктних рішеннях.",
  },
];

const TT_BY_ID = Object.fromEntries(TASK_TEMPLATES.map(t => [t.id, t]));
window.TASK_TEMPLATES = TASK_TEMPLATES;
window.getTaskTemplate = (id) => TT_BY_ID[id];


// ===================================================================
// ШАБЛОНИ ЕТАПІВ (групи задач для конкретного етапу)
// ===================================================================
const STAGE_TEMPLATES = [
  // ----- Етап: ПРОЄКТ -----
  // Нове будівництво
  { id: "stp-proj-new-nonprod", name: "Проєкт: нове будівництво (невиробниче)",
    stage: "project", icon: "🏗",
    description: "Повний пакет розділів для нової будівлі невиробничого призначення",
    taskTemplateIds: [
      "tt-geo-survey", "tt-geol-survey",
      "tt-ar-concept", "tt-ar-section", "tt-ar-landscape",
      "tt-kj-foundation", "tt-kj-slabs", "tt-kj-walls", "tt-kj-drawings",
      "tt-ov-section", "tt-vk-section", "tt-eo-section", "tt-ss-section",
      "tt-pb-section", "tt-engineering-networks",
    ],
  },
  { id: "stp-proj-new-prod", name: "Проєкт: нове будівництво (виробниче)",
    stage: "project", icon: "🏭",
    description: "Нова будівля/споруда виробничого призначення — з технологічною частиною",
    taskTemplateIds: [
      "tt-geo-survey", "tt-geol-survey", "tt-th-section",
      "tt-ar-concept", "tt-ar-section",
      "tt-kj-foundation", "tt-kj-slabs", "tt-kj-walls", "tt-kj-drawings",
      "tt-ov-section", "tt-vk-section", "tt-eo-section", "tt-ss-section",
      "tt-pb-section", "tt-engineering-networks",
    ],
  },
  // Капітальний ремонт
  { id: "stp-proj-caprepair-nonprod", name: "Проєкт: капітальний ремонт (невиробниче)",
    stage: "project", icon: "🛠",
    description: "Капремонт без зміни геометрії та несучої здатності — за відомістю дефектів",
    taskTemplateIds: [
      "tt-defect-act",
      "tt-ar-section",
      "tt-ov-section", "tt-vk-section", "tt-eo-section", "tt-pb-section",
    ],
  },
  { id: "stp-proj-caprepair-prod", name: "Проєкт: капітальний ремонт (виробниче)",
    stage: "project", icon: "🛠",
    description: "Капремонт виробничого об'єкта — з технологічною частиною",
    taskTemplateIds: [
      "tt-defect-act", "tt-th-section",
      "tt-ar-section",
      "tt-ov-section", "tt-vk-section", "tt-eo-section", "tt-pb-section",
    ],
  },
  // Реконструкція
  { id: "stp-proj-reconstruction-nonprod", name: "Проєкт: реконструкція (невиробниче)",
    stage: "project", icon: "🏛",
    description: "Реконструкція з технічним обстеженням і підсиленням конструкцій",
    taskTemplateIds: [
      "tt-to-inspection",
      "tt-ar-section",
      "tt-kj-reinforcement", "tt-kj-drawings",
      "tt-ov-section", "tt-vk-section", "tt-eo-section",
      "tt-pb-section", "tt-engineering-networks",
    ],
  },
  { id: "stp-proj-reconstruction-prod", name: "Проєкт: реконструкція (виробниче)",
    stage: "project", icon: "🏛",
    description: "Реконструкція виробничого об'єкта — з технологічною частиною",
    taskTemplateIds: [
      "tt-to-inspection", "tt-th-section",
      "tt-ar-section",
      "tt-kj-reinforcement", "tt-kj-drawings",
      "tt-ov-section", "tt-vk-section", "tt-eo-section",
      "tt-pb-section", "tt-engineering-networks",
    ],
  },
  // Реставрація
  { id: "stp-proj-restoration-nonprod", name: "Проєкт: реставрація (невиробниче)",
    stage: "project", icon: "🏺",
    description: "Реставрація пам'ятки: дослідження + погодження органу охорони спадщини",
    taskTemplateIds: [
      "tt-resto-research", "tt-to-inspection",
      "tt-ar-section",
      "tt-kj-reinforcement", "tt-kj-drawings",
      "tt-ov-section", "tt-eo-section",
      "tt-resto-heritage-approval", "tt-pb-section",
    ],
  },
  { id: "stp-proj-restoration-prod", name: "Проєкт: реставрація (виробниче)",
    stage: "project", icon: "🏺",
    description: "Реставрація/пристосування пам'ятки виробничого призначення — з технологічною частиною",
    taskTemplateIds: [
      "tt-resto-research", "tt-to-inspection", "tt-th-section",
      "tt-ar-section",
      "tt-kj-reinforcement", "tt-kj-drawings",
      "tt-ov-section", "tt-eo-section",
      "tt-resto-heritage-approval", "tt-pb-section",
    ],
  },
  // Схема намірів забудови (садибна / блокована)
  { id: "stp-proj-schema", name: "Проєкт: схема намірів забудови",
    stage: "project", icon: "🏘",
    description: "Будинок садибного типу або блокована забудова — за будівельним паспортом, без експертизи",
    taskTemplateIds: [
      "tt-schema-intent", "tt-build-passport",
      "tt-ar-section", "tt-vk-section", "tt-eo-section",
      "tt-notification-start",
    ],
  },

  // ----- Етап: КОШТОРИС -----
  { id: "stp-estimate-full", name: "Кошторис: повний цикл",
    stage: "estimate", icon: "💰",
    description: "Збір цін, локальні кошториси, зведений",
    taskTemplateIds: ["tt-est-prices", "tt-est-main", "tt-est-summary"],
  },

  // ----- Етап: ЕКСПЕРТИЗА -----
  { id: "stp-expertise-full", name: "Експертиза: комплексна",
    stage: "expertise", icon: "🔬",
    description: "Повна експертиза проєкту (для СС2/СС3 і складних СС1)",
    taskTemplateIds: ["tt-exp-prepare", "tt-exp-submit", "tt-exp-fixes", "tt-exp-conclusion"],
  },
  { id: "stp-expertise-estimate-only", name: "Експертиза: лише кошторис",
    stage: "expertise", icon: "📑",
    description: "Спрощена експертиза для СС1 у простих умовах — тільки кошторисна частина",
    taskTemplateIds: ["tt-exp-prepare", "tt-exp-submit", "tt-exp-conclusion"],
  },
  { id: "stp-expertise-strength", name: "Експертиза: МОС + кошторис",
    stage: "expertise", icon: "🛡",
    description: "Для СС1 у складних техногенних умовах (підвищена сейсмічність, зсуви, підтоплення тощо). Експертиза в частині міцності, остійності та стійкості (МОС) разом із кошторисною частиною — для бюджетних об'єктів кошторис перевіряється завжди.",
    taskTemplateIds: ["tt-exp-prepare", "tt-exp-submit", "tt-exp-fixes", "tt-exp-conclusion"],
  },

  // ----- Етап: ЄДЕССБ -----
  { id: "stp-edessb-full", name: "ЄДЕССБ: реєстрація",
    stage: "edessb", icon: "🏛",
    description: "Повний цикл реєстрації в Єдиному реєстрі",
    taskTemplateIds: [
      "tt-edessb-prepare", "tt-edessb-kep", "tt-edessb-submit", "tt-edessb-fee", "tt-edessb-receipt",
    ],
  },

  // ----- Етап: АВТОРСЬКИЙ НАГЛЯД -----
  { id: "stp-supervision-month", name: "АН: місячний цикл",
    stage: "supervision", icon: "👷",
    description: "Регулярний цикл задач АН для активного будівництва",
    taskTemplateIds: [
      "tt-an-visit", "tt-an-check-nodes", "tt-an-journal", "tt-an-photos", "tt-an-report",
    ],
  },
];

const ST_BY_ID = Object.fromEntries(STAGE_TEMPLATES.map(s => [s.id, s]));
window.STAGE_TEMPLATES = STAGE_TEMPLATES;
window.getStageTemplate = (id) => ST_BY_ID[id];


// ===================================================================
// ШАБЛОНИ ПРОЄКТІВ (повні пакети для типу об'єкта)
// ===================================================================
const PROJECT_TEMPLATES = [
  // ===== Спеціальний: схема намірів забудови =====
  { id: "pt-schema", name: "Схема намірів забудови",
    icon: "🏘", direction: "design",
    workType: "schema", purpose: null,
    description: "Будинок садибного типу або блокована забудова. За будівельним паспортом — без експертизи.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: undefined,
    estimatedDays: 20,
    stageTemplateIds: ["stp-proj-schema"],
  },

  // ===== Невиробниче призначення =====
  { id: "pt-new-ss1-np", name: "Нове будівництво — СС1",
    icon: "🏗", direction: "design",
    workType: "new", purpose: "non_production",
    description: "Нова будівля/споруда невиробничого призначення, клас СС1. Експертиза кошторису.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 55,
    stageTemplateIds: ["stp-proj-new-nonprod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-new-ss23-np", name: "Нове будівництво — СС2 / СС3",
    icon: "🏗", direction: "design",
    workType: "new", purpose: "non_production",
    description: "Нова будівля/споруда невиробничого призначення, клас СС2 або СС3 (однакові вимоги). Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 95,
    stageTemplateIds: ["stp-proj-new-nonprod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },
  { id: "pt-caprep-ss1-np", name: "Капітальний ремонт — СС1",
    icon: "🛠", direction: "design",
    workType: "capital_repair", purpose: "non_production",
    description: "Капремонт об'єкта невиробничого призначення, клас СС1. Експертиза кошторису.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 35,
    stageTemplateIds: ["stp-proj-caprepair-nonprod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-caprep-ss23-np", name: "Капітальний ремонт — СС2 / СС3",
    icon: "🛠", direction: "design",
    workType: "capital_repair", purpose: "non_production",
    description: "Капремонт об'єкта невиробничого призначення, клас СС2 або СС3. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 50,
    stageTemplateIds: ["stp-proj-caprepair-nonprod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },
  { id: "pt-recon-ss1-np", name: "Реконструкція — СС1",
    icon: "🏛", direction: "design",
    workType: "reconstruction", purpose: "non_production",
    description: "Реконструкція об'єкта невиробничого призначення, клас СС1. Експертиза кошторису.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 60,
    stageTemplateIds: ["stp-proj-reconstruction-nonprod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-recon-ss23-np", name: "Реконструкція — СС2 / СС3",
    icon: "🏛", direction: "design",
    workType: "reconstruction", purpose: "non_production",
    description: "Реконструкція об'єкта невиробничого призначення, клас СС2 або СС3. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 85,
    stageTemplateIds: ["stp-proj-reconstruction-nonprod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },
  { id: "pt-resto-ss1-np", name: "Реставрація — СС1",
    icon: "🏺", direction: "design",
    workType: "restoration", purpose: "non_production",
    description: "Реставрація пам'ятки невиробничого призначення, клас СС1. Експертиза кошторису + погодження органу охорони спадщини.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 75,
    stageTemplateIds: ["stp-proj-restoration-nonprod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-resto-ss23-np", name: "Реставрація — СС2 / СС3",
    icon: "🏺", direction: "design",
    workType: "restoration", purpose: "non_production",
    description: "Реставрація пам'ятки невиробничого призначення, клас СС2 або СС3. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 105,
    stageTemplateIds: ["stp-proj-restoration-nonprod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },

  // ===== Виробниче призначення (те саме, з технологічною частиною) =====
  { id: "pt-new-ss1-p", name: "Нове будівництво — СС1",
    icon: "🏭", direction: "design",
    workType: "new", purpose: "production",
    description: "Нова будівля/споруда виробничого призначення, клас СС1. З технологічною частиною. Експертиза кошторису.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 65,
    stageTemplateIds: ["stp-proj-new-prod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-new-ss23-p", name: "Нове будівництво — СС2 / СС3",
    icon: "🏭", direction: "design",
    workType: "new", purpose: "production",
    description: "Нова будівля/споруда виробничого призначення, клас СС2 або СС3. З технологічною частиною. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 110,
    stageTemplateIds: ["stp-proj-new-prod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },
  { id: "pt-caprep-ss1-p", name: "Капітальний ремонт — СС1",
    icon: "🛠", direction: "design",
    workType: "capital_repair", purpose: "production",
    description: "Капремонт виробничого об'єкта, клас СС1. З технологічною частиною. Експертиза кошторису.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 45,
    stageTemplateIds: ["stp-proj-caprepair-prod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-caprep-ss23-p", name: "Капітальний ремонт — СС2 / СС3",
    icon: "🛠", direction: "design",
    workType: "capital_repair", purpose: "production",
    description: "Капремонт виробничого об'єкта, клас СС2 або СС3. З технологічною частиною. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 60,
    stageTemplateIds: ["stp-proj-caprepair-prod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },
  { id: "pt-recon-ss1-p", name: "Реконструкція — СС1",
    icon: "🏭", direction: "design",
    workType: "reconstruction", purpose: "production",
    description: "Реконструкція виробничого об'єкта, клас СС1. З технологічною частиною. Експертиза кошторису.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 70,
    stageTemplateIds: ["stp-proj-reconstruction-prod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-recon-ss23-p", name: "Реконструкція — СС2 / СС3",
    icon: "🏭", direction: "design",
    workType: "reconstruction", purpose: "production",
    description: "Реконструкція виробничого об'єкта, клас СС2 або СС3. З технологічною частиною. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 95,
    stageTemplateIds: ["stp-proj-reconstruction-prod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },
  { id: "pt-resto-ss1-p", name: "Реставрація — СС1",
    icon: "🏺", direction: "design",
    workType: "restoration", purpose: "production",
    description: "Реставрація/пристосування пам'ятки виробничого призначення, клас СС1. Експертиза кошторису + погодження органу охорони спадщини.",
    objectGrade: "СС1", gradeLabel: "СС1", expertiseScope: "estimate",
    estimatedDays: 85,
    stageTemplateIds: ["stp-proj-restoration-prod", "stp-estimate-full", "stp-expertise-estimate-only", "stp-edessb-full"],
  },
  { id: "pt-resto-ss23-p", name: "Реставрація — СС2 / СС3",
    icon: "🏺", direction: "design",
    workType: "restoration", purpose: "production",
    description: "Реставрація/пристосування пам'ятки виробничого призначення, клас СС2 або СС3. Комплексна експертиза.",
    objectGrade: "СС2", gradeLabel: "СС2 / СС3", expertiseScope: "full",
    estimatedDays: 115,
    stageTemplateIds: ["stp-proj-restoration-prod", "stp-estimate-full", "stp-expertise-full", "stp-edessb-full"],
  },

  // ===== Авторський нагляд =====
  { id: "pt-supervision", name: "Авторський нагляд (щомісячний)",
    icon: "👷", direction: "supervision",
    workType: "supervision", purpose: null,
    description: "Регулярний цикл задач авторського нагляду для активного будівництва.",
    estimatedDays: 30,
    stageTemplateIds: ["stp-supervision-month"],
  },
];

window.PROJECT_TEMPLATES = PROJECT_TEMPLATES;
window.getProjectTemplate = (id) => PROJECT_TEMPLATES.find(t => t.id === id);


// ===================================================================
// БАЗОВІ (НАСКРІЗНІ) ЗАДАЧІ
// Описуються ОДИН раз + правило застосовності appliesTo.
// Рушій підставляє їх при створенні проєкту — без копіювання в кожен шаблон етапу.
//   appliesTo.all            — до всіх типів робіт
//   appliesTo.excludeWorkTypes — до всіх, КРІМ перелічених типів робіт
//   appliesTo.onlyWorkTypes  — лише для перелічених типів
// ===================================================================
const BASELINE_TASKS = [
  {
    taskTemplateId: "tt-assign-gip",
    stage: "project",
    appliesTo: { all: true },
    rationale: "Керівник проєкту потрібен для будь-якого типу робіт.",
  },
  {
    taskTemplateId: "tt-consequence-class",
    stage: "project",
    appliesTo: { excludeWorkTypes: ["schema"] },
    rationale: "Клас наслідків рахують для всього, крім схеми намірів забудови (там — будівельний паспорт без класифікації).",
  },
];
window.BASELINE_TASKS = BASELINE_TASKS;

// Які наскрізні задачі застосовуються до заданого типу робіт
window.baselineTasksFor = function (workType) {
  return BASELINE_TASKS.filter(b => {
    const a = b.appliesTo || {};
    if (a.onlyWorkTypes) return a.onlyWorkTypes.includes(workType);
    if (a.excludeWorkTypes) return !a.excludeWorkTypes.includes(workType);
    return !!a.all;
  });
};

// Людський опис правила застосовності
window.appliesToLabel = function (appliesTo) {
  const a = appliesTo || {};
  if (a.all) return "Усі типи проєктів";
  if (a.excludeWorkTypes) {
    const names = a.excludeWorkTypes.map(w => (window.WORK_TYPE_LABELS[w]?.label || w));
    return "Усі, крім: " + names.join(", ");
  }
  if (a.onlyWorkTypes) {
    const names = a.onlyWorkTypes.map(w => (window.WORK_TYPE_LABELS[w]?.label || w));
    return "Лише: " + names.join(", ");
  }
  return "—";
};


// ===================================================================
// ПРАВИЛО: ОБСЯГ ЕКСПЕРТИЗИ ВИВОДИТЬСЯ З КЛАСУ НАСЛІДКІВ
// (клас рухомий → обсяг перераховується, а не «зашитий» у шаблон)
// ===================================================================
window.EXPERTISE_SCOPE_LABELS = {
  estimate: { label: "Кошторис", note: "тільки кошторис", full: "Експертиза кошторисної частини" },
  strength: { label: "МОС + кошторис", note: "МОС + кошторис", full: "Міцність, остійність, стійкість + кошторис" },
  full:     { label: "Комплексна", note: "комплексна", full: "Комплексна експертиза проєкту" },
};

window.EXPERTISE_STAGE_FOR_SCOPE = {
  estimate: "stp-expertise-estimate-only",
  strength: "stp-expertise-strength",
  full:     "stp-expertise-full",
};

// Обсяг експертизи з класу наслідків (+ ознака складних техногенних умов для СС1)
window.expertiseScopeForGrade = function (grade, opts) {
  opts = opts || {};
  if (grade === "СС1") return opts.complexTechno ? "strength" : "estimate";
  return "full"; // СС2 / СС3
};

// ===================================================================
// ДОВІДНИКИ
// ===================================================================
const ASSIGNEE_ROLE_LABELS = {
  "gip":           { label: "ГІП",                    icon: "👔" },
  "architect":     { label: "Архітектор",             icon: "✏️" },
  "constructor":   { label: "Конструктор",            icon: "🏗" },
  "engineer-ovk":  { label: "Інженер ОВ-ВК",          icon: "🌬" },
  "electrician":   { label: "Електрик",               icon: "⚡️" },
  "estimator":     { label: "Кошторисник",            icon: "💰" },
  "geodesist":     { label: "Геодезист (підрядник)",  icon: "📐" },
  "geologist":     { label: "Геолог (підрядник)",     icon: "🪨" },
  "technologist":  { label: "Інженер-технолог",         icon: "⚙️" },
  "accountant":    { label: "Бухгалтер",              icon: "🧾" },
  "director":      { label: "Директор",               icon: "👔" },
  "hr":            { label: "Кадри / HR",             icon: "📁" },
};
window.ASSIGNEE_ROLE_LABELS = ASSIGNEE_ROLE_LABELS;

const DIRECTION_LABELS = {
  design:      { label: "Проєктування",       short: "Проєкт",     color: "var(--c-green-deep)" },
  supervision: { label: "Авторський нагляд",  short: "АН",         color: "var(--c-blue)" },
};
window.DIRECTION_LABELS = DIRECTION_LABELS;

// Тип робіт та призначення об'єкта — для групування шаблонів
const WORK_TYPE_LABELS = {
  new:            { label: "Нове будівництво", short: "Нове буд.", icon: "🏗", order: 1 },
  capital_repair: { label: "Капітальний ремонт", short: "Капремонт", icon: "🛠", order: 2 },
  reconstruction: { label: "Реконструкція", short: "Реконстр.", icon: "🏛", order: 3 },
  restoration:    { label: "Реставрація", short: "Реставр.", icon: "🏺", order: 4 },
  schema:         { label: "Схема намірів забудови", short: "Схема намірів", icon: "🏘", order: 0 },
  supervision:    { label: "Авторський нагляд", short: "АН", icon: "👷", order: 9 },
};
window.WORK_TYPE_LABELS = WORK_TYPE_LABELS;

const PURPOSE_LABELS = {
  non_production: { label: "Невиробниче призначення", short: "Невиробн." },
  production:     { label: "Виробниче призначення", short: "Виробн." },
};
window.PURPOSE_LABELS = PURPOSE_LABELS;

const ATTACHMENT_TYPE_LABELS = {
  form:     "Форма",
  report:   "Звіт",
  drawing:  "Креслення",
};
window.ATTACHMENT_TYPE_LABELS = ATTACHMENT_TYPE_LABELS;


// ===================================================================
// HR / КОМАНДА — шаблони кадрових процесів
// Окрема гілка шаблонів (поряд із проєктними). Запускаються вручну
// або автоматично з картки людини при настанні кар'єрної події
// (отримано сертифікат, відкрилась позиція ГАП тощо).
// ===================================================================

// --- Атомарні кадрові задачі ---
const HR_TASK_TEMPLATES = [
  { id: "hrtt-order-transfer", title: "Наказ про переведення на посаду",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 1, deadlineOffset: 2,
    description: "Підготувати й підписати наказ про переведення працівника на нову посаду згідно зі штатним розписом.",
    checklist: ["Перевірити чинність кваліфікаційного сертифіката", "Узгодити нову посаду зі штатним розписом", "Підписати наказ КЕП директора", "Ознайомити працівника під підпис"] },
  { id: "hrtt-add-agreement", title: "Додаткова угода до трудового договору",
    icon: "✍️", section: "HR", assigneeRole: "accountant", estDays: 1, deadlineOffset: 3,
    description: "Оформити додаткову угоду до трудового договору з новою посадою та розміром окладу.",
    checklist: ["Внести нову посаду", "Внести новий оклад", "Підписати обома сторонами"] },
  { id: "hrtt-recalc-salary", title: "Перерахунок окладу та штатного розпису",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 1, deadlineOffset: 3,
    description: "Оновити оклад у штатному розписі та платіжній відомості. Урахувати дату набрання чинності.",
    checklist: ["Оновити штатний розпис", "Перерахувати оклад з дати наказу", "Оновити картку нарахувань ЗП"] },
  { id: "hrtt-order-category", title: "Наказ про підвищення кваліфікаційної категорії",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 1, deadlineOffset: 2,
    description: "Наказ про присвоєння інженеру-проєктувальнику нової кваліфікаційної категорії за результатом сертифікації.",
    checklist: ["Перевірити клас наслідків у сертифікаті", "Визначити категорію (ІІ / І / провідний)", "Підписати наказ", "Ознайомити працівника"] },
  { id: "hrtt-order-bonus", title: "Наказ про надбавку за кваліфікаційний сертифікат",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 1, deadlineOffset: 2,
    description: "Наказ про встановлення надбавки до окладу за наявність чинного кваліфікаційного сертифіката (без зміни посади).",
    checklist: ["Перевірити чинність сертифіката", "Визначити розмір надбавки", "Підписати наказ"] },
  { id: "hrtt-update-edessb", title: "Оновити дані в ЄДЕССБ та реквізити КЕП",
    icon: "🔐", section: "HR", assigneeRole: "gip", estDays: 1, deadlineOffset: 5,
    description: "Оновити посаду й роль фахівця в Єдиному реєстрі (ЄДЕССБ) та звірити дані КЕП під нову посаду.",
    checklist: ["Оновити роль у кабінеті ЄДЕССБ", "Звірити дані сертифіката КЕП", "Перевірити права підпису розділів"] },
  { id: "hrtt-update-file", title: "Оновити особову справу та профіль",
    icon: "📁", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 5,
    description: "Внести зміни до особової справи, профілю в ERP та повідомити суміжні служби.",
    checklist: ["Додати копію наказу до справи", "Оновити посаду в профілі ERP", "Повідомити бухгалтерію та ГІПа"] },

  // --- Прийняття на роботу ---
  { id: "hrtt-employment-contract", title: "Трудовий договір і наказ про прийняття",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 1, deadlineOffset: 0,
    description: "Підготувати трудовий договір та наказ про прийняття на роботу. Узгодити посаду й оклад зі штатним розписом.",
    checklist: ["Узгодити посаду та оклад", "Підготувати трудовий договір", "Видати наказ про прийняття", "Ознайомити працівника під підпис"] },
  { id: "hrtt-dpa-notify-hire", title: "Повідомлення про прийняття до ДПС",
    icon: "🏦", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 0,
    description: "Подати повідомлення про прийняття працівника до територіального органу ДПС — обов'язково до фактичного допуску до роботи.",
    checklist: ["Заповнити форму повідомлення", "Подати через кабінет платника до першого робочого дня", "Зберегти квитанцію"] },
  { id: "hrtt-personal-file", title: "Завести особову справу",
    icon: "📁", section: "HR", assigneeRole: "hr", estDays: 1, deadlineOffset: 2,
    description: "Сформувати особову справу нового працівника й створити профіль у системі.",
    checklist: ["Зібрати копії документів (паспорт, РНОКПП, диплом)", "Заповнити особову картку П-2", "Створити профіль в ERP"] },
  { id: "hrtt-workplace-access", title: "Робоче місце та доступи",
    icon: "💻", section: "HR", assigneeRole: "hr", estDays: 1, deadlineOffset: 1,
    description: "Підготувати робоче місце, видати техніку зі складу, налаштувати акаунти й доступи.",
    checklist: ["Корпоративна пошта та акаунти", "Доступ до Drive / ERP за роллю", "Видати обладнання зі складу"] },
  { id: "hrtt-kep-issue", title: "Оформлення КЕП",
    icon: "🔐", section: "HR", assigneeRole: "gip", estDays: 2, deadlineOffset: 5,
    description: "Оформити кваліфікований електронний підпис для роботи з документами та ЄДЕССБ (для фахівців, що підписують розділи).",
    checklist: ["Подати заявку до АЦСК / Дія.Підпис", "Згенерувати ключ і захистити пароль", "Внести реквізити КЕП у профіль"] },
  { id: "hrtt-safety-briefing", title: "Ввідний інструктаж з охорони праці",
    icon: "🛡", section: "HR", assigneeRole: "director", estDays: 0.5, deadlineOffset: 1,
    description: "Провести ввідний інструктаж з охорони праці та пожежної безпеки із записом у журналі.",
    checklist: ["Провести ввідний інструктаж", "Запис у журналі інструктажів", "Підпис працівника"] },
  { id: "hrtt-mentor-plan", title: "Наставник і план онбордингу",
    icon: "👥", section: "HR", assigneeRole: "gip", estDays: 1, deadlineOffset: 2,
    description: "Призначити наставника та скласти план адаптації на перші два тижні (за чек-листом онбордингу).",
    checklist: ["Призначити наставника", "Скласти план на 2 тижні", "Контрольна точка наприкінці випробування"] },

  // --- Субпідряд (ЦПХ) ---
  { id: "hrtt-cph-contract", title: "Договір ЦПХ із субпідрядником",
    icon: "🤝", section: "HR", assigneeRole: "director", estDays: 1, deadlineOffset: 2,
    description: "Оформити цивільно-правовий договір на виконання робіт із фахівцем-субпідрядником.",
    checklist: ["Узгодити обсяг, строки та вартість", "Підписати договір ЦПХ", "Додати реквізити для оплати"] },
  { id: "hrtt-cph-act", title: "Шаблон акта виконаних робіт",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 3,
    description: "Підготувати шаблон акта приймання-передачі робіт за договором ЦПХ для подальших виплат.",
    checklist: ["Шаблон акта виконаних робіт", "Порядок утримання ПДФО та ВЗ"] },

  // --- Звільнення ---
  { id: "hrtt-dismiss-order", title: "Заява і наказ про звільнення",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 1, deadlineOffset: 1,
    description: "Оформити звільнення працівника згідно з підставою (заява, угода сторін тощо).",
    checklist: ["Отримати заяву / підставу", "Видати наказ про звільнення", "Ознайомити під підпис"] },
  { id: "hrtt-final-settlement", title: "Остаточний розрахунок",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 1, deadlineOffset: 0,
    description: "Повний розрахунок у день звільнення: зарплата та компенсація за невикористану відпустку.",
    checklist: ["Розрахувати компенсацію за невикористану відпустку", "Нарахувати зарплату за відпрацьоване", "Виплата в день звільнення"] },
  { id: "hrtt-dpa-notify-fire", title: "Повідомлення про звільнення до ДПС",
    icon: "🏦", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 1,
    description: "Відобразити звільнення у звітності та реєстрі застрахованих осіб." },
  { id: "hrtt-handover-docs", title: "Видача документів і відкликання доступів",
    icon: "📁", section: "HR", assigneeRole: "hr", estDays: 0.5, deadlineOffset: 1,
    description: "Видати працівникові документи, відкликати КЕП і закрити доступи.",
    checklist: ["Видати довідки / трудову (за потреби)", "Відкликати КЕП і доступи (пошта, Drive, ERP)", "Закрити особову справу"] },

  // --- Відпустка ---
  { id: "hrtt-vacation-request", title: "Заява на відпустку",
    icon: "📅", section: "HR", assigneeRole: "hr", estDays: 0.5, deadlineOffset: 0,
    description: "Прийняти заяву на щорічну відпустку, перевірити залишок днів і узгодити заміщення.",
    checklist: ["Перевірити залишок днів відпустки", "Узгодити заміщення на час відсутності"] },
  { id: "hrtt-vacation-order", title: "Наказ про відпустку",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 0.5, deadlineOffset: 1,
    description: "Видати наказ про надання щорічної відпустки." },
  { id: "hrtt-vacation-pay", title: "Розрахунок і виплата відпускних",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 1, deadlineOffset: 0,
    description: "Розрахувати відпускні за середнім заробітком і виплатити не пізніше ніж за 3 дні до початку відпустки.",
    checklist: ["Розрахунок за середньоденним заробітком", "Виплата не пізніше ніж за 3 дні до початку"] },

  // --- Лікарняний ---
  { id: "hrtt-eln", title: "Е-лікарняний (ЕЛН)",
    icon: "📅", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 1,
    description: "Отримати електронний листок непрацездатності з реєстру та перевірити дати.",
    checklist: ["Отримати ЕЛН з електронного реєстру", "Перевірити дати та статус", "Відмітка у табелі"] },
  { id: "hrtt-sick-pay", title: "Розрахунок лікарняних",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 1, deadlineOffset: 3,
    description: "Нарахувати оплату непрацездатності: перші 5 днів — за рахунок роботодавця, далі — від ФСС.",
    checklist: ["Перші 5 днів — за рахунок роботодавця", "Решта — допомога від ФСС", "Відобразити в нарахуваннях"] },

  // --- Відрядження ---
  { id: "hrtt-trip-order", title: "Наказ про відрядження",
    icon: "📜", section: "HR", assigneeRole: "director", estDays: 0.5, deadlineOffset: 1,
    description: "Оформити наказ про відрядження: мета, місце, строки.",
    checklist: ["Мета та маршрут", "Строки відрядження", "Кошторис витрат"] },
  { id: "hrtt-trip-advance", title: "Аванс на відрядження",
    icon: "💳", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 1,
    description: "Видати аванс на відрядження: добові, проживання, проїзд.",
    checklist: ["Добові за нормою", "Проживання та проїзд"] },
  { id: "hrtt-trip-report", title: "Авансовий звіт",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 1, deadlineOffset: 5,
    description: "Прийняти авансовий звіт у встановлений строк після повернення.",
    checklist: ["Зібрати чеки та документи", "Подати авансовий звіт у строк", "Повернути / доплатити різницю"] },

  // --- Кваліфікація та КЕП ---
  { id: "hrtt-training-enroll", title: "Запис на підвищення кваліфікації",
    icon: "🎓", section: "HR", assigneeRole: "gip", estDays: 1, deadlineOffset: 14,
    description: "Записати фахівця на підвищення кваліфікації (раз на 5 років від останньої атестації).",
    checklist: ["Обрати акредитовану організацію", "Записати фахівця на курс / атестацію"] },
  { id: "hrtt-training-pay", title: "Оплата навчання",
    icon: "🧾", section: "HR", assigneeRole: "accountant", estDays: 0.5, deadlineOffset: 14,
    description: "Оплатити навчання та облікувати витрати." },
  { id: "hrtt-training-update", title: "Оновити дату атестації та ЄДЕССБ",
    icon: "🔄", section: "HR", assigneeRole: "gip", estDays: 0.5, deadlineOffset: 30,
    description: "Після навчання внести нову дату атестації у профіль і подати відомості про безперервність стажу до ЄДЕССБ.",
    checklist: ["Внести нову дату атестації в сертифікат", "Подати відомості в ЄДЕССБ", "Оновити статус у профілі"] },
  { id: "hrtt-kep-renew", title: "Поновлення КЕП",
    icon: "🔐", section: "HR", assigneeRole: "gip", estDays: 1, deadlineOffset: 7,
    description: "Перевипустити кваліфікований електронний підпис до завершення строку дії.",
    checklist: ["Перевірити строк дії КЕП", "Перевипуск через АЦСК / Дія.Підпис", "Оновити реквізити в профілі"] },
];
const HRTT_BY_ID = Object.fromEntries(HR_TASK_TEMPLATES.map(t => [t.id, t]));
window.HR_TASK_TEMPLATES = HR_TASK_TEMPLATES;
window.getHrTaskTemplate = (id) => HRTT_BY_ID[id];

// --- Процеси (набори кадрових задач) ---
const HR_PROCESS_TEMPLATES = [
  { id: "hrt-architect-gap", name: "Переведення архітектора на посаду ГАП",
    icon: "👔", category: "career",
    trigger: "Архітектор отримав кваліфікаційний сертифікат, а посада Головного архітектора проєкту ще вакантна",
    effect: "Посада → Головний архітектор проєкту (ГАП) · оклад +5 000 ₴",
    description: "Перший сертифікований архітектор переводиться на посаду ГАП. Повний кадровий пакет: наказ, додаткова угода, перерахунок ЗП, оновлення ЄДЕССБ.",
    taskTemplateIds: ["hrtt-order-transfer", "hrtt-add-agreement", "hrtt-recalc-salary", "hrtt-update-edessb", "hrtt-update-file"] },
  { id: "hrt-engineer-category", name: "Підвищення категорії інженера-проєктувальника",
    icon: "📐", category: "career",
    trigger: "Інженер-проєктувальник отримав сертифікат вищого класу наслідків (СС1 → ІІ кат., СС2 → І кат., СС3 → провідний)",
    effect: "Нова кваліфікаційна категорія · оклад +3 000 ₴ за щабель",
    description: "Підвищення кваліфікаційної категорії за результатом сертифікації. Наказ, перерахунок окладу, оновлення особової справи.",
    taskTemplateIds: ["hrtt-order-category", "hrtt-recalc-salary", "hrtt-update-edessb", "hrtt-update-file"] },
  { id: "hrt-cert-bonus", name: "Надбавка за кваліфікаційний сертифікат",
    icon: "🎖", category: "career",
    trigger: "Фахівець отримав сертифікат, але переведення на іншу посаду не передбачено (другий архітектор; кошторисник / технолог із сертифікатом без класу СС)",
    effect: "Посада без змін · оклад +3 000 ₴ (надбавка)",
    description: "Визнання кваліфікації без зміни посади: наказ про надбавку та перерахунок ЗП.",
    taskTemplateIds: ["hrtt-order-bonus", "hrtt-recalc-salary", "hrtt-update-file"] },

  // --- Прийняття та звільнення ---
  { id: "hrt-hire", name: "Прийняття на роботу (штат)",
    icon: "👤", category: "hiring", effectIcon: "clock",
    trigger: "Новий працівник виходить на роботу у штат",
    effect: "Повідомлення в ДПС — до першого робочого дня",
    description: "Повний онбординг: договір і наказ, повідомлення в ДПС, особова справа, доступи й техніка, КЕП, інструктаж, наставник.",
    taskTemplateIds: ["hrtt-employment-contract", "hrtt-dpa-notify-hire", "hrtt-personal-file", "hrtt-workplace-access", "hrtt-kep-issue", "hrtt-safety-briefing", "hrtt-mentor-plan"] },
  { id: "hrt-hire-cph", name: "Залучення субпідрядника (ЦПХ)",
    icon: "🤝", category: "hiring", effectIcon: "clock",
    trigger: "Залучення фахівця за цивільно-правовим договором",
    effect: "Без зарахування у штат · оплата за актами",
    description: "Оформлення співпраці за договором ЦПХ: договір і шаблон акта виконаних робіт.",
    taskTemplateIds: ["hrtt-cph-contract", "hrtt-cph-act"] },
  { id: "hrt-dismiss", name: "Звільнення працівника",
    icon: "📤", category: "hiring", effectIcon: "clock",
    trigger: "Звільнення за заявою / угодою сторін",
    effect: "Остаточний розрахунок — у день звільнення",
    description: "Наказ про звільнення, остаточний розрахунок із компенсацією відпустки, повідомлення ДПС, видача документів і відкликання доступів.",
    taskTemplateIds: ["hrtt-dismiss-order", "hrtt-final-settlement", "hrtt-dpa-notify-fire", "hrtt-handover-docs"] },

  // --- Відпустки та відсутності ---
  { id: "hrt-vacation", name: "Щорічна відпустка",
    icon: "🏖", category: "leave", effectIcon: "clock",
    trigger: "Заява працівника на щорічну відпустку",
    effect: "Відпускні — не пізніше ніж за 3 дні до початку",
    description: "Заява та перевірка залишку днів, наказ про відпустку, розрахунок і виплата відпускних.",
    taskTemplateIds: ["hrtt-vacation-request", "hrtt-vacation-order", "hrtt-vacation-pay"] },
  { id: "hrt-sick", name: "Лікарняний",
    icon: "⚠️", category: "leave", effectIcon: "clock",
    trigger: "Відкрито листок непрацездатності",
    effect: "Перші 5 днів — за рахунок роботодавця",
    description: "Електронний лікарняний з реєстру, розрахунок оплати непрацездатності, відмітка в табелі.",
    taskTemplateIds: ["hrtt-eln", "hrtt-sick-pay"] },
  { id: "hrt-trip", name: "Відрядження",
    icon: "🚗", category: "leave", effectIcon: "clock",
    trigger: "Виїзд працівника у службове відрядження",
    effect: "Авансовий звіт — у встановлений строк",
    description: "Наказ про відрядження, аванс (добові, проживання, проїзд), авансовий звіт після повернення.",
    taskTemplateIds: ["hrtt-trip-order", "hrtt-trip-advance", "hrtt-trip-report"] },

  // --- Кваліфікація та КЕП ---
  { id: "hrt-training", name: "Підвищення кваліфікації",
    icon: "🎓", category: "compliance", effectIcon: "clock",
    trigger: "Наближається 5-річний строк атестації фахівця",
    effect: "Раз на 5 років · оновлення в ЄДЕССБ",
    description: "Запис на навчання/атестацію, оплата, оновлення дати атестації та подання відомостей до ЄДЕССБ.",
    taskTemplateIds: ["hrtt-training-enroll", "hrtt-training-pay", "hrtt-training-update"] },
  { id: "hrt-kep", name: "Оформлення / поновлення КЕП",
    icon: "🔐", category: "compliance", effectIcon: "clock",
    trigger: "Новий фахівець або завершення строку дії КЕП",
    effect: "Контроль строку дії підпису",
    description: "Перевипуск або первинне оформлення кваліфікованого електронного підпису.",
    taskTemplateIds: ["hrtt-kep-renew"] },
];
const HRT_BY_ID = Object.fromEntries(HR_PROCESS_TEMPLATES.map(t => [t.id, t]));
window.HR_PROCESS_TEMPLATES = HR_PROCESS_TEMPLATES;
window.getHrProcessTemplate = (id) => HRT_BY_ID[id];

// Категорії кадрових процесів (для групування на сторінці шаблонів)
window.HR_CATEGORY_LABELS = [
  { key: "career",     label: "Кар'єрні переходи та сертифікація" },
  { key: "hiring",     label: "Прийняття та звільнення" },
  { key: "leave",      label: "Відпустки та відсутності" },
  { key: "compliance", label: "Кваліфікація та КЕП" },
];

})();
