window.__noodl_modules = []; window.Noodl = { defineModule:function(m) { window.__noodl_modules.push(m); }, deployed: true, Env: {} } window.projectData = {"settings":{"navigationPathType":"hash","projectVersion":"v2.28.3","envVersion":"d2","project":"rasko","dbVersion":2,"dbClasses":"[{\r\n\r\n // 'directory-manager': {\r\n // version: 1,\r\n // references: [ 'user'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 100 }\r\n // }\r\n // },\r\n // 'architect': {\r\n // version: 1,\r\n // references: [ 'user'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 100 }\r\n // }\r\n // },\r\n // 'current-id': {\r\n // version: 1,\r\n // references: [ 'architect'],\r\n // defaults: {\r\n // sorts: [{ 'content.currentArchitect.currentIdProject': 'asc' }],\r\n // options: { size: 100 }\r\n // }\r\n // },\r\n // 'work-group': {\r\n // version: 1,\r\n // references: ['work-group'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'work': {\r\n // version: 1,\r\n // references: ['work-group', 'unit'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'unit': {\r\n // version: 1,\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'material-group': {\r\n // version: 1,\r\n // references: ['material-group'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'material': {\r\n // version: 1,\r\n // references: ['material-group', 'unit'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'object': {\r\n // version: 1,\r\n // defaults: {\r\n // sorts: [{ 'content.address': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'project': {\r\n // version: 1,\r\n // references: ['object'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'project-material': {\r\n // version: 1,\r\n // references: ['project', \"project-stage\", \"project-material-group\", \"project-work\", \"material\", \"material-group\", \"unit\", 'architect'],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n // 'project-material-group': {\r\n // version: 1,\r\n // references: ['project', \"project-stage\", \"project-material-group\", \"material-group\"],\r\n // defaults: {\r\n // sorts: [{ 'content.name': 'asc' }],\r\n // options: { size: 1000 }\r\n // }\r\n // },\r\n}]\r\n\r\n/*[\r\n {\r\n 'work-group': {\r\n version: 1,\r\n subscribe: true,\r\n references: ['work-group'],\r\n defaultSort: { 'content.name': 'asc' },\r\n defaultOptions: { size: 100 }\r\n },\r\n 'work': {\r\n version: 1,\r\n subscribe: true,\r\n references: ['work-group'],\r\n defaultSort: { 'content.name': 'asc' },\r\n defaultOptions: { size: 100 }\r\n },\r\n }\r\n]*/","environment":"p3"},"components":[{"name":"/App","nodes":[{"id":"3c809236-b659-e21e-a09e-5680ee981e5d","type":"JavaScriptFunction","parameters":{"functionScript":"// function numberToWords(number) {\r\n// // Массив названий разрядов\r\n// const units = [\"\", \"один\", \"два\", \"три\", \"четыре\", \"пять\", \"шесть\", \"семь\", \"восемь\", \"девять\"];\r\n// const tens = [\"\", \"десять\", \"двадцать\", \"тридцать\", \"сорок\", \"пятьдесят\", \"шестьдесят\", \"семьдесят\", \"восемьдесят\", \"девяносто\"];\r\n// const hundreds = [\"\", \"сто\", \"двести\", \"триста\", \"четыреста\", \"пятьсот\", \"шестьсот\", \"семьсот\", \"восемьсот\", \"девятьсот\"];\r\n\r\n// // Разделение числа на разряды\r\n// const numStr = number.toString();\r\n// const n = numStr.length;\r\n// const unitsDigit = parseInt(numStr[n - 1]);\r\n// const tensDigit = parseInt(numStr[n - 2] || 0);\r\n// const hundredsDigit = parseInt(numStr[n - 3] || 0);\r\n\r\n// // Формирование строки слов\r\n// let words = \"\";\r\n\r\n// if (hundredsDigit > 0) {\r\n// words += hundreds[hundredsDigit] + \" \";\r\n// }\r\n\r\n// if (tensDigit > 1) {\r\n// words += tens[tensDigit] + \" \";\r\n// } else if (tensDigit == 1) {\r\n// words += tens[10] + \" \";\r\n// }\r\n\r\n// if (unitsDigit > 0) {\r\n// words += units[unitsDigit] + \" \";\r\n// }\r\n\r\n// // Обработка копеек\r\n// if (number % 1 !== 0) {\r\n// const decimalPart = number.toFixed(2).split('.')[1];\r\n// words += decimalPart + \" копеек\";\r\n// }\r\n\r\n// return words.replace(/\\s+/g, \" \").trim();\r\n// }\r\n\r\n// const number = 39898.14;\r\n// const words = numberToWords(number);\r\n\r\n// // console.log(words); // тридцать девять тысяч восемьсот девяносто восемь рублей четырнадцать копеек\r\n\r\n\r\n// const number = 6667;\r\n// const words = writtenNumber(number, { lang: 'ru', decimalDigits: 0 });\r\n\r\n// Outputs.ttt = R\r\n\r\n// const writtenNumber = require('js-written-number');\r\n// const writtenNumber = require('js-written-number');\r\n// const number = 123456789.9876;\r\n// var writtenNumber = new writtenNumber();\r\n// const options = {\r\n// lang: 'ru',\r\n// decimalDigits: 2,\r\n// separator: ',',\r\n// zeroAs: 'ноль',\r\n// currency: {\r\n// name: 'рублей',\r\n// precision: 2,\r\n// }\r\n// };\r\n// // const result = writtenNumber(12.34, options);\r\n// // const result = writtenNumber(number, options);\r\n// const result = writtenNumber(12.67, options)\r\n// console.log(result); // \"тринадцать\"\r\n\r\n// import writtenNumber from 'js-written-number';\r\n\r\n// const options = {\r\n// lang: 'ru',\r\n// decimalDigits: 2,\r\n// separator: ',',\r\n// zeroAs: 'ноль',\r\n// currency: {\r\n// name: 'рублей',\r\n// precision: 2,\r\n// }\r\n// };\r\n\r\n// const result = writtenNumber(12.67, options);\r\n// console.log(result); // Должно вывести \"двенадцать рублей шестьдесят семь копеек\""},"ports":[{"name":"out-ttt","displayName":"ttt","plug":"output","type":"*","group":"Outputs","index":4}],"children":[]},{"id":"61e70dc4-7d6b-844a-f5a5-14707e1e2106","type":"JavaScriptFunction","parameters":{"functionScript":"/**\r\n * @description Конвертит процентные значения в пиксели с округлением.\r\n * Идеально для реальных размеров элементов на экране, где дробные пиксели не нужны.\r\n * \r\n * @param {number} totalWidth - Общая ширина контейнера в пикселях\r\n * @param {...number} percentages - Процентные значения (должны в сумме давать 100%)\r\n * @returns {number[]} Массив значений в пикселях с округлением\r\n * @throws {Error} Если данные некорректны\r\n * \r\n * @example\r\n * // Для колонок таблицы:\r\n * calculatePixelsRounded(1000, 30, 50, 20) // [300, 500, 200]\r\n * \r\n * // Для блоков на странице:\r\n * calculatePixelsRounded(1920, 25, 75) // [480, 1440]\r\n */\r\nfunction calculatePixelsRounded(totalWidth, ...percentages) {\r\n // Проверяем входные данные\r\n if (!totalWidth || totalWidth <= 0) {\r\n throw new Error('Братан, ширина должна быть больше нуля! 📏');\r\n }\r\n\r\n if (!percentages.length) {\r\n throw new Error('Где проценты, чел? Я не экстрасенс! 🔮');\r\n }\r\n\r\n // Проверяем сумму процентов (допускаем погрешность из-за округления)\r\n const sum = percentages.reduce((acc, curr) => acc + curr, 0);\r\n if (Math.abs(sum - 100) > 0.1) {\r\n throw new Error('Сумма процентов должна быть около 100%! Сейчас: ' + sum + '% 🤔');\r\n }\r\n\r\n return percentages.map(percentage => Math.round((percentage / 100) * totalWidth));\r\n}\r\n\r\n/**\r\n * @description Конвертит процентные значения в пиксели без округления.\r\n * Полезно для точных вычислений или когда нужно сохранить пропорции.\r\n * \r\n * @param {number} totalWidth - Общая ширина контейнера в пикселях\r\n * @param {...number} percentages - Процентные значения (должны в сумме давать 100%)\r\n * @returns {number[]} Массив значений в пикселях с плавающей точкой\r\n * @throws {Error} Если данные некорректны\r\n * \r\n * @example\r\n * // Для точных расчетов:\r\n * calculatePixelsExact(1000, 33.33, 66.67) // [333.3, 666.7]\r\n * \r\n * // Для адаптивной верстки:\r\n * calculatePixelsExact(1440, 41.67, 58.33) // [600.048, 839.952]\r\n */\r\nfunction calculatePixelsExact(totalWidth, ...percentages) {\r\n if (!totalWidth || totalWidth <= 0) {\r\n throw new Error('Ширина должна быть положительным числом! 📐');\r\n }\r\n\r\n if (!percentages.length) {\r\n throw new Error('No percentage values provided! 💢');\r\n }\r\n\r\n const sum = percentages.reduce((acc, curr) => acc + curr, 0);\r\n if (Math.abs(sum - 100) > 0.1) {\r\n throw new Error(`Бро, сумма процентов ${sum}% немного не 100%... 🤨`);\r\n }\r\n\r\n return percentages.map(percentage => (percentage / 100) * totalWidth);\r\n}\r\n\r\n\r\n\r\n/* // Для не точных вычислений\r\ntry {\r\n const mainLayout = calculatePixelsRounded(1920, 20, 60, 20);\r\n console.log(mainLayout); // [384, 1152, 384]\r\n} catch (error) {\r\n console.error('Упс:', error.message);\r\n}\r\n\r\n// Для точных вычислений\r\ntry {\r\n const preciseLayout = calculatePixelsExact(1000, 33.33, 66.67);\r\n console.log(preciseLayout); // [333.3, 666.7]\r\n} catch (error) {\r\n console.error('Что-то пошло не так:', error.message);\r\n} */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/* /////////////////////////////////////// calculatePixelsWithRounding /////////////////////////////////////////////////\r\n// Функция `calculatePixelsWithRounding` принимает общую ширину в пикселях и проценты в качестве аргументов. \r\n// Она затем использует массив процентов, чтобы вычислить соответствующую ширину каждого значения с округлением \r\n// при помощи метода `Math.round`. Наконец, функция возвращает массив значений ширины в пикселях.\r\n// С округлением:\r\nfunction calculatePixelsWithRounding(totalWidth, ...percentages) {\r\n const pixels = percentages.map(percentage => Math.round((percentage / 100) * totalWidth));\r\n return pixels;\r\n}\r\n// Пример:\r\nconst widthColumnsWithRounding = calculatePixelsWithRounding(500, 5, 70, 11, 14);\r\n// [25, 350, 55, 70]\r\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n///////////////////////////////////// calculatePixelsWithoutRounding ////////////////////////////////////////////////\r\n// Функция `calculatePixelsWithoutRounding` также принимает общую ширину в пикселях и проценты в качестве аргументов. \r\n// Она вычисляет соответствующую ширину каждого значения без округления и возвращает массив значений ширины в пикселях.\r\n// Без округления:\r\nfunction calculatePixelsWithoutRounding(totalWidth, ...percentages) {\r\n const pixels = percentages.map(percentage => (percentage / 100) * totalWidth);\r\n return pixels;\r\n}\r\n\r\n// Пример:\r\nconst widthColumnsWithoutRounding = calculatePixelsWithoutRounding(500, 5.6726094003241485, 69.69205834683954, 10.696920583468396, 13.938411669367909);\r\n// [28.363047001620742, 348.4602917341977, 53.48460291734199, 69.69205834683954]\r\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n */"},"ports":[],"children":[]},{"id":"d6dbba4d-7cc7-60a2-fd51-d41151d70d28","type":"JavaScriptFunction","parameters":{"functionScript":"Outputs.timeHistory = R.libs.dayjs(1753248015860).format('DD.MM.YY HH:mm')\r\nOutputs.timeHistoryInKuzzle = R.libs.dayjs(1753175471132).format('DD.MM.YY HH:mm')\r\nOutputs.timeHistoryInKuzzle2 = R.libs.dayjs(1753175434474).format('DD.MM.YY HH:mm')\r\nOutputs.timeStamp = R.libs.dayjs(1753258480750).format('DD.MM.YY HH:mm')\r\n\r\n\r\n/* ```js\r\n// 🕒 СОЗДАНИЕ ДАТЫ\r\nconst now = dayjs() // текущая дата \"2025-01-11T16:07:43.494Z\"\r\nconst fromStr = dayjs('2024-03-13') // из строки\r\nconst fromMs = dayjs(1705248000000) // из миллисекунд\r\nconst fromUnix = dayjs.unix(1710345600) // из unix timestamp (секунды)\r\n\r\n// 📝 ФОРМАТИРОВАНИЕ\r\ndate.format('DD.MM.YYYY') // \"13.03.2024\"\r\ndate.format('HH:mm:ss') // \"16:00:00\"\r\ndate.format('DD.MM.YY HH:mm') // \"13.03.24 16:00\"\r\n\r\n// 🔄 КОНВЕРТАЦИЯ\r\ndate.valueOf() // в миллисекунды: 1710345600000\r\ndate.unix() // в unix timestamp: 1710345600\r\ndate.toDate() // в Date объект\r\ndate.toISOString() // в ISO строку: \"2024-03-13T16:00:00.000Z\"\r\n\r\n// ⚡ МАНИПУЛЯЦИИ\r\ndate.startOf('day') // начало дня\r\ndate.endOf('month') // конец месяца\r\ndate.add(1, 'day') // добавить день\r\ndate.subtract(2, 'hours') // убрать 2 часа\r\n\r\n// 🤔 ПРОВЕРКИ\r\ndate.isValid() // валидная дата?\r\ndate.isBefore(other) // раньше чем other?\r\ndate.isAfter(other) // позже чем other?\r\ndate.isSame(other) // равны?\r\n\r\n// 🔍 ДЕБАГ И ВАЛИДАЦИЯ\r\nconst validateDates = (dates) => {\r\n const invalid = dates.filter(d => !d?.isValid())\r\n if (invalid.length) {\r\n console.warn('💩 Битые даты:', invalid.map(d => d.debug()))\r\n return false\r\n }\r\n return true\r\n}\r\n\r\n// ⚖️ СРАВНЕНИЕ ДАТ\r\ndayjs.max([date1, date2]) // максимальная дата\r\ndayjs.min([date1, date2]) // минимальная дата\r\n\r\n// 📏 РАЗНИЦА МЕЖДУ ДАТАМИ\r\ndate1.diff(date2, 'days') // разница в днях\r\nMath.ceil(dayjs.duration(date2 - date1).asDays()) // дней между датами\r\n``` */\r\n\r\n\r\n\r\n\r\n// // это одно и тоже\r\n// let currentDate1 = new Date()\r\n// let currentDate2 = R.libs.dayjs()\r\n\r\n// // подаем дату в таком формате, строка \"2024-03-13T16:00:00.000Z\"\r\n// let date = \"2024-03-13T16:00:00.000Z\"\r\n// // получаем отформатированную дату\"24.03.2024\"\r\n// R.libs.dayjs(date).format('DD.MM.YYYY') \r\n// // получаем дату в секундах, целое число 1710345600\r\n// R.libs.dayjs(date).unix()\r\n// // получаем дату в милисекундах, целое число 1710345600000\r\n// R.libs.dayjs(date).valueOf()\r\n\r\n\r\n// // дату в секундах\r\n// let dateS = 1710345600\r\n// // дату в милисекундах\r\n// let dateMs = 1705248000000\r\n// // Вывод: в R.libs.dayjs() нужно подавать дату в милисекундах а не в секундах иначе дата неверная\r\n// Outputs.print1 = R.libs.dayjs(dateS).format('DD.MM.YYYY') // print1:\"1970-01-20T19:05:45.600Z\" // print1:\"21.01.1970\"\r\n// Outputs.print2 = R.libs.dayjs(dateMs).format('DD.MM.YYYY') // print2:\"2024-01-14T16:00:00.000Z\" // print2:\"15.01.2024\"\r\n\r\n// Outputs.currentDate = R.libs.dayjs().valueOf()\r\n// // print1:\"1970-01-20T19:05:45.600Z\"\r\n// // print2:\"2024-01-14T16:00:00.000Z\"\r\n// // // получаем дату в формате UTC \"2024-01-14T16:00:00.000Z\"\r\n// // R.libs.dayjs(dateMs)\r\n\r\n// ```js\r\n// // 1. БЫСТРАЯ ПРОВЕРКА\r\n// const date = dayjs('2024-08-28')\r\n// date.isValid() // true/false\r\n\r\n// // 2. МАССОВАЯ ПРОВЕРКА\r\n// const dates = [dayjs('2024-08-28'), dayjs('wat?')]\r\n// dates.every(d => d.isValid()) // false\r\n\r\n// // 3. DEBUG MODE\r\n// const badDate = dayjs('wat?')\r\n// badDate.debug() // покажет что пошло не так\r\n\r\n// // 4. БЫСТРЫЙ ШАБЛОН ДЛЯ ПРОЕКТА\r\n// const validateDates = (dates) => {\r\n// const invalid = dates.filter(d => !d?.isValid())\r\n// if (invalid.length) {\r\n// console.warn('💩 Битые даты:', invalid.map(d => d.debug()))\r\n// return false\r\n// }\r\n// return true\r\n// }\r\n// ```"},"ports":[{"name":"out-timeHistory","displayName":"timeHistory","plug":"output","type":"*","group":"Outputs","index":4},{"name":"out-timeHistoryInKuzzle","displayName":"timeHistoryInKuzzle","plug":"output","type":"*","group":"Outputs","index":5},{"name":"out-timeHistoryInKuzzle2","displayName":"timeHistoryInKuzzle2","plug":"output","type":"*","group":"Outputs","index":6},{"name":"out-timeStamp","displayName":"timeStamp","plug":"output","type":"*","group":"Outputs","index":7},{"name":"out-print1","displayName":"print1","plug":"output","type":"*","group":"Outputs","index":8},{"name":"out-print2","displayName":"print2","plug":"output","type":"*","group":"Outputs","index":9},{"name":"out-currentDate","displayName":"currentDate","plug":"output","type":"*","group":"Outputs","index":10}],"children":[]},{"id":"c4b7a29c-12ab-af73-dc5b-db7d8ceef120","type":"JavaScriptFunction","parameters":{"functionScript":"/**\r\n * @description Конвертит числовые значения в проценты с округлением до целых. \r\n * Автоматически корректирует сумму до 100%.\r\n * \r\n * @param {...number} numbers - Числовые значения (например, ширины колонок в пикселях)\r\n * @returns {number[]} Массив процентов, где сумма всегда равна 100\r\n * @throws {Error} Если переданы некорректные аргументы\r\n * \r\n * @example\r\n * // Для колонок таблицы:\r\n * calculatePercentages(100, 200, 300) // [17, 33, 50]\r\n * \r\n * // Для разделения экрана:\r\n * calculatePercentages(400, 600) // [40, 60]\r\n */\r\nfunction calculatePercentages(...numbers) {\r\n // Валидация входных данных\r\n if (!numbers.length) {\r\n throw new Error('Йоу, ты забыл передать числа! 🤔');\r\n }\r\n \r\n if (numbers.some(num => typeof num !== 'number' || num <= 0)) {\r\n throw new Error('Йоу, только положительные числа! 🚫');\r\n }\r\n\r\n const sum = numbers.reduce((acc, curr) => acc + curr, 0);\r\n let percentages = numbers.map(num => Math.round((num / sum) * 100));\r\n \r\n // Коррекция суммы до 100%\r\n const totalSum = percentages.reduce((acc, curr) => acc + curr, 0);\r\n const remainder = 100 - totalSum;\r\n percentages[0] += remainder;\r\n\r\n return percentages;\r\n}\r\n\r\n/**\r\n * @description Конвертит числовые значения в проценты без округления.\r\n * Идеально для случаев, когда нужна максимальная точность.\r\n * \r\n * @param {...number} numbers - Числовые значения\r\n * @returns {number[]} Массив процентов с плавающей точкой\r\n * @throws {Error} Если переданы некорректные аргументы\r\n * \r\n * @example\r\n * // Для точных расчетов:\r\n * calculatePercentagesExact(333, 667) // [33.3, 66.7]\r\n */\r\nfunction calculatePercentagesExact(...numbers) {\r\n if (!numbers.length) {\r\n throw new Error('Нужны числа, чтобы магия случилась! ✨');\r\n }\r\n \r\n if (numbers.some(num => typeof num !== 'number' || num <= 0)) {\r\n throw new Error('Только положительные числа, братан! 🎯');\r\n }\r\n\r\n const sum = numbers.reduce((acc, curr) => acc + curr, 0);\r\n return numbers.map(num => (num / sum) * 100);\r\n}\r\n\r\n\r\n/* // Для не точных вычислений, округление до целого\r\nconst tableColumns = calculatePercentages(150, 300, 550);\r\nconsole.log(tableColumns); // [15, 30, 55]\r\n\r\n// Для точных вычислений\r\nconst exactValues = calculatePercentagesExact(333, 667);\r\nconsole.log(exactValues); // [33.3, 66.7] */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/* ////////////////////////////////////////// calculatePercentages /////////////////////////////////////////////////////\r\n// Функция `calculatePercentages` принимает произвольное количество чисел в качестве аргументов. \r\n// Она сначала вычисляет сумму всех чисел. Затем для каждого числа вычисляется процент от суммы \r\n// с помощью округления до целого числа методом `Math.round`. В результате получается массив процентов, \r\n// где каждый процент округлен и сумма процентов равна 100. Если сумма процентов отличается от 100, \r\n// то остаток добавляется к первому числу в массиве.\r\n// с округлением, и проверкой что в сумме получается 100\r\nfunction calculatePercentages(...numbers) {\r\n const sum = numbers.reduce((acc, curr) => acc + curr, 0);\r\n let percentages = numbers.map(num => Math.round((num / sum) * 100));\r\n const totalSum = percentages.reduce((acc, curr) => acc + curr, 0);\r\n const remainder = 100 - totalSum;\r\n percentages[0] += remainder; // добавляем остаток к первому числу\r\n return percentages;\r\n}\r\n// Пример:\r\nconst widthColumns = calculatePercentages(35, 430, 66, 86);\r\n// [5, 70, 11, 14] \r\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n////////////////////////////////////////// calculatePercentages2 /////////////////////////////////////////////////////\r\n// Функция `calculatePercentages2` также принимает произвольное количество чисел в качестве аргументов. \r\n// Она вычисляет сумму всех чисел, а затем для каждого числа вычисляет его процент от суммы без округления. \r\n// В результате получается массив процентов без округления.\r\n// без округления\r\nfunction calculatePercentages2(...numbers) {\r\n const sum = numbers.reduce((acc, curr) => acc + curr, 0);\r\n return numbers.map(num => (num / sum) * 100);\r\n}\r\n// Пример:\r\nconst widthColumns2 = calculatePercentages2(35, 430, 66, 86);\r\n// [5.6726094003241485, 69.69205834683954, 10.696920583468396, 13.938411669367909]\r\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\nOutputs.vvv = calculatePercentages(300, 180, 73, 193, 138, 138, 112, 45)//10+10+10+10\r\n// Outputs.r = R\r\n */"},"ports":[{"name":"out-vvv","displayName":"vvv","plug":"output","type":"*","group":"Outputs","index":4},{"name":"out-r","displayName":"r","plug":"output","type":"*","group":"Outputs","index":5}],"children":[]},{"id":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","type":"States","parameters":{"states":"initial,notAuthenticated,admin,architect,directoryManager","values":"authOpacity,authMounted,adminMounted,architectMounted,directoryManagerMounted,adminOpacity,architectOpacity,directoryManagerOpacity","type-authMounted":"boolean","type-adminMounted":"boolean","type-companyManagerMounted":"boolean","value-notAuthenticated-authMounted":true,"value-admin-adminMounted":true,"value-companyManager-opacity":1,"value-companyManager-companyManagerMounted":true,"transition-initial-opacity":{"curve":[0,0,0.58,1],"dur":500,"delay":0},"transition-notAuthenticated-opacity":{"curve":[0,0,0.58,1],"dur":500,"delay":0},"transition-admin-opacity":{"curve":[0,0,0.58,1],"dur":500,"delay":0},"transition-companyAdmin-opacity":{"curve":[0,0,0.58,1],"dur":500,"delay":0},"transition-companyManager-opacity":{"curve":[0,0,0.58,1],"dur":500,"delay":0},"transition-worker-opacity":{"curve":[0,0,0.58,1],"dur":500,"delay":0},"type-notificationsPosition":"string","value-notAuthenticated-notificationsPosition":"bottom-right","value-admin-notificationsPosition":"bottom-right","value-companyManager-notificationsPosition":"bottom-right","type-newAppMounted":"boolean","value-newApp-newAppMounted":true,"value-directoryManager-notificationsPosition":"top-right","type-directoryManagerMounted":"boolean","value-directoryManager-directoryManagerMounted":true,"value-architect-notificationsPosition":"bottom-right","type-architectMounted":"boolean","value-architect-architectMounted":true,"value-notAuthenticated-architectMounted":false,"value-initial-authOpacity":0,"value-initial-authMounted":false,"useTransitions":false,"value-architect-architectOpacity":1,"value-architect-adminOpacity":0,"value-architect-directoryManagerOpacity":0,"value-architect-authOpacity":0,"value-directoryManager-directoryManagerOpacity":1,"value-directoryManager-architectOpacity":0,"value-directoryManager-adminOpacity":0,"value-directoryManager-authOpacity":0,"value-admin-authOpacity":0,"value-admin-adminOpacity":1,"value-admin-architectOpacity":0,"value-admin-directoryManagerOpacity":0,"value-notAuthenticated-authOpacity":1,"value-notAuthenticated-adminOpacity":0,"value-notAuthenticated-architectOpacity":0,"value-notAuthenticated-directoryManagerOpacity":0,"value-initial-adminOpacity":0,"value-initial-architectOpacity":0,"value-initial-directoryManagerOpacity":0},"ports":[],"children":[]},{"id":"3b1fc3c7-9f74-6528-00cb-c633566ec754","type":"rolder-kit.api-v1.App","parameters":{"version":"v2.1.0","dbName":"data_v1","backendDevMode":false,"useSurrealDb":true,"customBackend":false,"database":"prod","useKuzzle":true,"useAuth":true,"kuzzleDefaultDbName":"data_v1","surrealDbDatabase":"data","useNetwork":true},"ports":[],"children":[{"id":"805c5a88-434f-b4ea-298c-c73fea06d49a","type":"rolder-kit.api-v1.Mantine","parameters":{"version":"v2.0.0"},"ports":[],"children":[{"id":"2a5977e4-295c-0bde-1087-1c17a269966d","type":"/App/SignIn","parameters":{},"ports":[],"children":[]},{"id":"3bc4222d-7cc3-90a0-f342-f6962f950037","type":"rolder-kit.Data","parameters":{"version":"v2.0.0","dbName":"data"},"ports":[],"children":[{"id":"fb1eb0db-0683-72a4-aa04-08f38589711a","type":"/App/admin","parameters":{},"ports":[],"children":[]},{"id":"96fdcbed-4341-e3ff-87a7-183c5dd07aef","type":"/App/directory-Manager","parameters":{},"ports":[],"children":[]},{"id":"03d0f1d8-72b6-0011-aba2-07baed6820b5","type":"/App/architect","parameters":{},"ports":[],"children":[]}]}]}]},{"id":"a3048cf4-f77d-6be4-6a98-e7d168d1f282","type":"JavaScriptFunction","parameters":{"functionScript":"// Для методов clearItemForUpdate и clearItemsForUpdate\nconst excludeFields = ['dbClass', 'rid', 'table']; // массив полей, которые нужно исключить\n\nNoodl.Variables.functions = {\n // все вложенные разделы, в разделе. { withSelf: true }\n nestedSectionsInSection(sectionsWithDepth, parentSection, parentKey) {\n return sectionsWithDepth?.filter((section) => {\n if (section?.id === parentSection?.id) {\n return true\n }\n if (section[parentKey] && section[parentKey].id === parentSection?.id) {\n return true\n } else if (section[parentKey] && section[parentKey][parentKey]) {\n return this.nestedSectionsInSection([section[parentKey]], parentSection, parentKey).length > 0\n } else {\n return false\n }\n })\n },\n // все вложенные работы или материалы, в разделе.\n nestedItemsInSection(itemsWithDepth, parentSection, parentKey) {\n return itemsWithDepth?.filter((item) => {\n if (item[parentKey] && item[parentKey].id === parentSection?.id) {\n return true;\n } else if (item[parentKey] && item[parentKey][parentKey]) {\n return this.nestedItemsInSection([item[parentKey]], parentSection, parentKey).length > 0;\n } else {\n return false;\n }\n });\n },\n // Вычисляем наценку.\n getMarkup(value, withMarkup) {\n return (((withMarkup - value) / value) * 100) || 0;\n },\n // Вычисляем скидку.\n getDiscount(value, withMarkup) {\n return (((withMarkup - value) / withMarkup) * 100) || 0\n },\n // Вычисляем рентабельность.\n getProfitability(value, withMarkup) {\n return (((withMarkup - value) / withMarkup) * 100) || 0;\n },\n // Функция генерирует id.\n // Можно заменить на R.libs.nanoid(12) 12 - длина id\n generateRandomId() {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let newID = ''\n\n for (let i = 0; i < 20; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length)\n newID += characters.charAt(randomIndex)\n }\n\n return newID\n },\n // Подготовка материала по данным форм и заранее созданных группировок.\n // values - дефолтное содержания материала. Отличия разруливаютися в формах.\n // location: { // Группировки, каждая - это id/\n // specificationGroupId: string,\n // equipGroupId: string,\n // materialGroupId?: string // Может отсуствовать.\n //}\n // => выдает подготовленный материал со всеми связями (организованностями)\n prepareMaterial(values, location) {\n return {\n content: {\n name: values.name,\n ...values.code ? { code: values.code } : {},\n ...values.brand ? { brand: values.brand } : {},\n ...values.urlMaterial ? { urlMaterial: values.urlMaterial } : {},\n ...values.comment ? { comment: values.comment } : {},\n price: {\n quantity: values.quantity || 1,\n value: values.value || 0,\n totalValue: values.value * values.quantity || 0,\n withMarkup: values.withMarkup || 0,\n totalWithMarkup: values.withMarkup * values.quantity || 0\n },\n dimensions: {\n length: values.length || 0,\n width: values.width || 0,\n height: values.height || 0,\n }\n },\n project: { id: values.projectId },\n ...values.unit ? { unit: { id: values.unit } } : {},\n ...R.user.user.role.value === \"architect\" ? { \"architect\": { id: R.user.id } } : { \"directory-manager\": { id: R.user.id } },\n states: { archived: false },\n // Группировки.\n 'specification-group': { id: location.specificationGroupId },\n 'equip-group': { id: location.equipGroupId },\n ...location.materialGroupId ? { 'material-group': { id: location.materialGroupId } } : {}\n }\n },\n // Натуральная сортировка. Если не указывать sortPath, тогда функция думает что сортирует массив значений.\n /* naturalSort(originalArray, sortPath) {\n const { get } = R.libs.just;\n const compare = new Intl.Collator(['ru', 'en'], { numeric: true, sensitivity: \"base\" }).compare;\n\n if (originalArray?.length) {\n const getStringValue = (value) => String(value || '').trim()\n return {\n sortedArray: [...originalArray].sort((a, b) => {\n const aValue = sortPath ? get(a, sortPath) : a; // Если sortPath нет, используем a напрямую\n const bValue = sortPath ? get(b, sortPath) : b; // Если sortPath нет, используем b напрямую\n return compare(getStringValue(aValue), getStringValue(bValue));\n }),\n count: originalArray.length,\n }\n } else return {\n sortedArray: [],\n count: 0,\n }\n }, */\n // Натуральная сортировка. Если не указывать sortPath, тогда функция думает что сортирует массив значений. \"эту жора боработал, внедрил direction\"\n naturalSort(originalArray, sortPath, direction = 'asc') { // direction по дефолту 'asc'\n const { get } = R.libs.just;\n const compare = new Intl.Collator(['ru', 'en'], {\n numeric: true,\n sensitivity: \"base\"\n }).compare;\n\n if (!originalArray?.length) {\n return {\n sortedArray: [],\n count: 0,\n };\n }\n\n const getStringValue = (value) => String(value || '').trim();\n\n return {\n sortedArray: [...originalArray].sort((a, b) => {\n const aValue = sortPath ? get(a, sortPath) : a;\n const bValue = sortPath ? get(b, sortPath) : b;\n // Умножаем результат на -1 для desc сортировки\n const multiplier = direction === 'desc' ? -1 : 1;\n return compare(getStringValue(aValue), getStringValue(bValue)) * multiplier;\n }),\n count: originalArray.length,\n };\n },\n naturalSortForActs(originalArray, direction = \"asc\", dbClassParent) {\n\n const extractOrder = (act) => {\n // Получаем номер заказа-наряда и номер акта отдельно\n const orderNumber = act.getRef(dbClassParent)?.content?.order || 99999999;\n const actNumber = act.content.order;\n\n // Формируем единую строку вида \".\"\n return `${orderNumber}.${actNumber}`;\n }\n\n // Используем локальную версию сравнения строк\n const compare = new Intl.Collator(['ru', 'en'], {\n numeric: true,\n sensitivity: 'base',\n }).compare;\n\n if (!originalArray?.length) {\n return {\n sortedArray: [],\n count: 0,\n };\n }\n\n // Определяем множитель направления сортировки\n const multiplier = direction === \"desc\" ? -1 : 1;\n\n return {\n sortedArray: [...originalArray].sort((a, b) => {\n // Извлекаем строки порядка для обоих объектов\n const aValue = extractOrder(a);\n const bValue = extractOrder(b);\n\n // Сортируем, учитывая направление\n return compare(aValue, bValue) * multiplier;\n }),\n count: originalArray.length,\n };\n },\n hierarchySort(originalArray, parentKey) {\n function sortArrayByHierarchy(unsortedArray, parentId, levelIndex, resultArray) {\n for (const item of unsortedArray) {\n if (item[parentKey]?.id === parentId) {\n // Создаем новый объект с тем же прототипом\n const newItem = Object.create(Object.getPrototypeOf(item));\n\n // Копируем все собственные свойства\n Object.entries(item).forEach(([key, value]) => {\n Object.defineProperty(newItem, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n });\n\n // Добавляем level\n Object.defineProperty(newItem, 'level', {\n value: levelIndex,\n enumerable: true,\n configurable: true,\n writable: true\n });\n\n resultArray.push(newItem);\n sortArrayByHierarchy(unsortedArray, item.id, levelIndex + 1, resultArray);\n }\n }\n }\n\n // Получаем элементы верхнего уровня\n const topLevelArray = originalArray?.filter(item => !item[parentKey]?.id) || [];\n const sortedArray = [];\n\n // Обрабатываем элементы верхнего уровня\n for (const item of topLevelArray) {\n // Создаем новый объект с тем же прототипом\n const newItem = Object.create(Object.getPrototypeOf(item));\n\n // Копируем все собственные свойства\n Object.entries(item).forEach(([key, value]) => {\n Object.defineProperty(newItem, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n });\n\n // Добавляем level\n Object.defineProperty(newItem, 'level', {\n value: 0,\n enumerable: true,\n configurable: true,\n writable: true\n });\n\n sortedArray.push(newItem);\n sortArrayByHierarchy(originalArray, item.id, 1, sortedArray);\n }\n\n return {\n sortedArray: sortedArray,\n count: (originalArray || []).length\n };\n },\n clearItemForUpdate(item) {\n // const excludeFields = ['dbClass', 'rid', 'table']; // массив полей, которые нужно исключить\n const clonedItem = R.libs.just.clone(item) // клонируем айтем чтобы не происходило мутации\n return Object.fromEntries(Object.entries(clonedItem).filter(([key]) => !excludeFields.includes(key))) // исключаем поля\n },\n clearItemsForUpdate(items) {\n // const excludeFields = ['dbClass', 'rid', 'table']; // массив полей, которые нужно исключить\n const clonedItems = R.libs.just.clone(items) // клонируем весь массив\n return clonedItems.map(item => // исключаем поля, перебирая массив\n Object.fromEntries(\n Object.entries(item).filter(([key]) => !excludeFields.includes(key))\n )\n )\n },\n setResponsibleUser(user, item) {\n /**\n * Устанавливает ответственного пользователя и разруливает конфликты ролей\n * @param {Object} user - объект пользователя с данными\n * @param {Object} item - элемент, к которому привязывается пользователь\n * @returns {Object} - объект с новой ролью и полями для удаления (если есть конфликт)\n */\n // Flow функции:\n // 1. Получаем роль и ID пользователя\n // 2. Проверяем есть ли конфликт с существующей ролью\n // 3. Если конфликт есть - добавляем поле для удаления старой роли\n // 4. Возвращаем обновленные данные\n\n // Вытаскиваем нужные данные из объекта пользователя\n const { dbClass, id } = user.user;\n\n // Определяем какие роли конфликтуют между собой\n // Например: если назначается directory-manager, то надо убрать architect и наоборот\n const conflictRoles = {\n 'directory-manager': 'architect',\n 'architect': 'directory-manager'\n };\n\n // Создаем базовый объект результата с новой ролью\n const result = {\n [dbClass]: { id }\n };\n\n // Проверяем: если в item есть конфликтующая роль\n // То добавляем её в список полей для удаления\n if (item[conflictRoles[dbClass]]) {\n result.deleteFields = [conflictRoles[dbClass]];\n }\n\n // Примеры возвращаемых данных:\n // 1. { \"directory-manager\": { id: \"123\" } }\n // 2. { \"architect\": { id: \"456\" }, deleteFields: [\"directory-manager\"] }\n return result;\n },\n createPerformanceTimer() {\n // Наша капсула времени для хранения всех меток\n const timeMarks = new Map();\n\n // Проверяем, где мы находимся - в Node.js или в браузере\n const isNode = typeof process !== 'undefined' && process.memoryUsage;\n\n return {\n start: (label = 'Default') => {\n timeMarks.set(label, {\n startTime: performance.now(),\n // Получаем память только если мы в Node.js\n ...(isNode && { memoryStart: process.memoryUsage().heapUsed })\n });\n console.log(`\n 🚀 Поехали: ${label}\n ⏰ Время старта: ${new Date().toLocaleTimeString()}\n `);\n },\n\n end: (label = 'Default') => {\n if (!timeMarks.has(label)) {\n console.log(`Йоу, чел! Ты забыл запустить таймер для ${label} 🤦‍♂️`);\n return;\n }\n\n const endTime = performance.now();\n const { startTime, memoryStart } = timeMarks.get(label);\n const duration = endTime - startTime;\n\n // Информацию о памяти выводим только в Node.js\n let memoryInfo = '';\n if (isNode) {\n const memoryEnd = process.memoryUsage().heapUsed;\n const memoryDiff = (memoryEnd - memoryStart) / 1024 / 1024;\n memoryInfo = `🧠 Использовано памяти: ${memoryDiff.toFixed(2)} MB`;\n }\n\n console.log(`\n 📊 Результаты для: ${label}\n ⏱️ Время выполнения: ${duration.toFixed(2)} мс\n ⚡ В секундах: ${(duration / 1000).toFixed(3)} сек\n ${memoryInfo}\n `);\n\n timeMarks.delete(label);\n },\n\n benchmark: (fn, iterations = 1000, label = 'Benchmark') => {\n console.log(`🏃‍♂️ Начинаем бенчмарк: ${iterations} итераций`);\n\n const times = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n fn();\n times.push(performance.now() - start);\n }\n\n const average = times.reduce((a, b) => a + b, 0) / times.length;\n const min = Math.min(...times);\n const max = Math.max(...times);\n\n console.log(`\n 🎯 Результаты бенчмарка для ${label}:\n 📈 Среднее время: ${average.toFixed(2)} мс\n ⬇️ Минимальное: ${min.toFixed(2)} мс\n ⬆️ Максимальное: ${max.toFixed(2)} мс\n `);\n }\n };\n },\n removeDuplicates(arr, path) {\n /*\n * Убирает дубликаты из массива объектов по указанному пути\n * @param {Array} arr - массив объектов\n * @param {string} path - путь до значения (например: 'id' или 'content.name')\n * @returns {Array} - массив без дубликатов\n */\n if (!Array.isArray(arr)) {\n console.warn('First argument must be an array');\n return [];\n }\n\n if (!path || typeof path !== 'string') {\n console.warn('Second argument must be a string');\n return [];\n }\n\n try {\n const parts = path.split('.');\n\n const getValue = (obj) => {\n return parts.reduce((acc, part) => {\n return acc && acc[part];\n }, obj);\n };\n\n return [...new Map(\n arr.map(item => [getValue(item), item])\n ).values()];\n\n } catch (error) {\n log.error('Noodl.Variables.functions.removeDuplicates() error.', error);\n R.libs.mantine.MantineError('Системная ошибка!', `Noodl.Variables.functions.removeDuplicates() error: ${error.message}`);\n }\n },\n // Создание security.user\n async createUser(props) {\n const Kuzzle = R.libs.Kuzzle\n\n if (!props) throw new Error('props is not defined') // props отстствует.\n\n const { profileIds, role, dbClass, username, password } = props\n\n if (!profileIds || !role || !dbClass || !username || !password) {\n throw new Error('All fields in props are required') // Какое то поле не заполнено.\n }\n\n try {\n const response = await Kuzzle.security.createUser(\n null, // ID будет сгенерен автоматически.\n {\n content: {\n profileIds: profileIds,\n role: role,\n dbClass: dbClass\n },\n credentials: {\n local: {\n username: username,\n password: password\n }\n }\n })\n // Возвращаем результат работы контроллера.\n return response\n } catch (error) {\n log.error('Noodl.Variables.function.createUser() error.', error);\n R.libs.mantine.MantineError('Системная ошибка!', `Noodl.Variables.function.createUser() error: ${error.message}`);\n }\n },\n // Функция записывает айтемы в R.items \n writeCustomItemsInRItems(items) {\n if (!Array.isArray(items)) console.warn('Argument must be an array');\n\n if (items?.length) {\n for (const item of items) {\n // Теперь находим элемент по id\n const existingItem = R.items[item.id];\n\n if (existingItem) {\n // Если такой элемент существует, обновляем его значения\n Object.assign(existingItem, item);\n } else {\n // Если такого элемента нет, создаём новый\n item.id = R.libs.nanoid(12); // Генерация уникального ID\n R.items[item.id] = { ...item }; // Добавление нового элемента\n }\n }\n }\n },\n // Асинхронный запрос к сервисам Nodered\n async useNoderedService(url, credentials, formData) {\n try {\n // Заголовки запроса\n const headers = {\n Authorization: `Basic ${btoa(`${credentials.username}:${credentials.password}`)}`,\n };\n\n // Параметры запроса\n const options = {\n method: 'POST',\n headers,\n body: formData,\n };\n\n // Отправляем запрос\n const response = await fetch(url, options);\n\n // Проверяем статус ответа\n if (!response.ok) {\n throw new Error(`Ошибка HTTP: ${response.status}`);\n }\n\n // Извлекаем JSON из ответа\n const jsonResponse = await response.json();\n\n return jsonResponse;\n } catch (error) {\n console.error('Ошибка при выполнении запроса к Nodered:', error.message);\n throw error;\n }\n },\n // Формирование FormData для тела запроса к Nodered\n getFormData(flowData, project, environment) {\n // Формируем объект FormData\n const formData = new FormData();\n if (flowData) {\n if (flowData.params) formData.append(\n 'params',\n JSON.stringify({\n // Так как запрос будет идти к сервисам, добавляем информацию о среде проекта\n project,\n environment,\n ...flowData.params,\n })\n )\n if (flowData.data) formData.append('data', JSON.stringify(flowData.data))\n if (flowData.files) flowData.files.map((i) => formData.append(encodeURIComponent(i.name), i))\n }\n\n return formData\n }\n /* Методы фильтрации ключей в объекте, не меняет исходный обьект, а создает и возвращает новый.\n R.libs.just.omit() - взять все ключи кроме эитх omit(object, [...arrayKeys])\n R.libs.just.pick() - взять только эти ключи pick(object, [...arrayKeys]) */\n\n /* Клонирует данные\n R.libs.just.clone() => возвращает новое значение */\n\n /* Метод берез значение из обьекта по пути.\n R.utils.getValue.v8(i, 'content.name') => возвращает значение */\n\n /* Форматирует число.\n R.libs.numbro('1000') => 1000\n R.libs.numbro('1000').format({ thousandSeparated: true, mantissa: 2 }) => '1 000.00' */\n\n /* Записывает значение в item.\n R.libs.just.set(item, ['content', 'name'] || 'content.name', formHook?.values?.name) => item.content.name: стало новым именем\n R.libs.just.get(item, ['content', 'name'] || 'content.name') => ворачивает значение если есть, иначе undefined */\n\n /* item.getDbClassState('change.added.label')\n getDbClassState('путьДоЗначенияОтStates') => возвращает значение\n getDbClassState('change.1.label') => возвращает значение. change.1 - это индекс массива */\n\n /* UseData \n dbClass: 'project-material', // это current\n dbClass: {\n name: 'project-material',\n version: 2 // это береться из массива versions\n },\n dbName: 'rasko_v3' // выбор индекса, если указан используется указанный, если не указан используется из App */\n\n /* Config\n \"version\": 2, // для старых current\n \"versions\": [ // для *новых чтобы выбирать версию\n 2,\n 4\n ],\n \"current\": 4 // для *новых current */\n\n /* HIERARCHY\n const nodeSnap = Inputs.node\n const node = R.nodes[nodeSnap.path]\n найти ноду в иерархии, найти её предков, и всем включить expansion\n node.states.expansion.value = false */\n}\n"},"ports":[{"name":"in-node","displayName":"node","plug":"input","type":"*","group":"Inputs","index":4}],"children":[]},{"id":"608d741b-a049-231d-f39f-388d6ffc01ca","type":"JavaScriptFunction","parameters":{"functionScript":"const numbro = R.libs.numbro\nconst format = { thousandSeparated: true, mantissa: 2 }\n\nNoodl.Variables.documentFormFuncs = {\n // Получаем агрегацию себестоимости.\n getTotalValue: (node, options) => {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n let totalValue = 0\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.getHistory(1)[0].metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'deleted') {\n totalValue = totalValue + descendant.content.price.totalValue\n }\n }\n\n return numbro(totalValue).format(format)\n }\n },\n // Получаем прошлую агрегацию себестоимости.\n getPastTotalValue(node, options) {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n let pastTotalValue = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n const pastHistoryItem = descendant.getHistory(100)\n .find(item => item.metaData?.[options.fieldNameInMetaData]?.[documentId] === \"notChanged\"\n || item.metaData?.[options.fieldNameInMetaData]?.[documentId] === 'added')\n\n if (pastHistoryItem.metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'added') {\n pastTotalValue = pastTotalValue + pastHistoryItem.item.content.price.totalValue\n }\n }\n\n return numbro(pastTotalValue).format(format)\n }\n },\n // Получаем агрегацию цены для клиента.\n getTotalWithMarkup(node, options) {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n let totalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.getHistory(1)[0].metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'deleted') {\n totalWithMarkup = totalWithMarkup + descendant.content.price.totalWithMarkup\n }\n }\n\n return numbro(totalWithMarkup).format(format)\n }\n },\n // Получаем прошлую агрегацию цены для клиента.\n getPastTotalWithMarkup(node, options) {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n let pastTotalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n const pastHistoryItem = descendant.getHistory(100)\n .find(item => item.metaData?.[options.fieldNameInMetaData]?.[documentId] === \"notChanged\"\n || item.metaData?.[options.fieldNameInMetaData]?.[documentId] === 'added')\n if (pastHistoryItem.metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'added') {\n pastTotalWithMarkup = pastTotalWithMarkup + pastHistoryItem.item.content.price.totalWithMarkup\n }\n }\n\n return numbro(pastTotalWithMarkup).format(format)\n }\n },\n // Получаем скидку\n getDiscount(node, options) {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n let totalValue = 0\n let totalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.getHistory(1)[0].metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'deleted') {\n totalValue = totalValue + descendant.content.price.totalValue\n totalWithMarkup = totalWithMarkup + descendant.content.price.totalWithMarkup\n }\n }\n\n const discount = Noodl.Variables.functions.getDiscount(totalValue, totalWithMarkup) || 0\n\n return numbro(discount).format(format)\n }\n },\n // Получаем прошлую скидку\n getPastDiscount(node, options) {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n let pastTotalValue = 0\n let pastTotalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n const pastHistoryItem = descendant.getHistory(100)\n .find(item => item.metaData?.[options.fieldNameInMetaData]?.[documentId] === \"notChanged\"\n || item.metaData?.[options.fieldNameInMetaData]?.[documentId] === 'added')\n if (pastHistoryItem.metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'added') {\n pastTotalValue = pastTotalValue + pastHistoryItem.item.content.price.totalValue\n pastTotalWithMarkup = pastTotalWithMarkup + pastHistoryItem.item.content.price.totalWithMarkup\n }\n }\n\n const pastDiscount = Noodl.Variables.functions.getDiscount(pastTotalValue, pastTotalWithMarkup)\n\n return numbro(pastDiscount).format(format)\n }\n },\n // Получить id родительского документа\n getParentDocumentId: (node, dbClassDocument) => {\n try {\n if (!node) {\n return null\n } else {\n const ancestors = node.ancestors(dbClassDocument)\n\n const documentId = ancestors[0].id\n\n if (!documentId) {\n return null\n }\n\n return documentId\n }\n\n } catch (error) {\n return null\n }\n },\n // Получить id родительского документа\n getDbClassParentDocument: (node) => {\n try {\n if (!node) {\n return null\n } else {\n if (node.item()?.content?.order) {\n return node.item().dbClass\n } else {\n const parentDocumentNode = node.ancestorNodes().find(i => i.item()?.content?.order)\n\n if (!parentDocumentNode.dbClass) {\n return null;\n }\n\n return parentDocumentNode.dbClass\n }\n }\n } catch (error) {\n return null\n }\n },\n // получить item родительского документа\n getParentDocumentItem: (node, dbClassDocument) => {\n if (node) {\n const documentId = node.ancestors(dbClassDocument)[0]\n\n return documentId\n } else {\n log.error(\"Нода не определена.\");\n }\n },\n // Сформировать опцию на лету, из полученной ноды.\n getOptions(node) {\n if (node) {\n const dbClassDocument = Noodl.Variables.documentFormFuncs.getDbClassParentDocument(node)\n let fieldNameInMetaData = ''\n let dbClassDescendants = ''\n\n if (dbClassDocument === 'specification-form') {\n fieldNameInMetaData = 'specificationForm'\n dbClassDescendants = 'project-material'\n } else if (dbClassDocument === 'customer-order-form') {\n fieldNameInMetaData = 'customerOrderForm'\n dbClassDescendants = 'project-material'\n } else if (dbClassDocument === 'treaty-pay-order-form') {\n fieldNameInMetaData = 'treatyPayOrderForm'\n dbClassDescendants = 'project-material'\n } else if (dbClassDocument === 'suplier-order-form') {\n fieldNameInMetaData = 'suplierOrderForm'\n dbClassDescendants = 'project-material'\n }\n return {\n dbClassDocument: dbClassDocument,\n dbClassDescendants: dbClassDescendants,\n fieldNameInMetaData: fieldNameInMetaData\n }\n }\n },\n // Получить состояние измененности во вложенности, для группировок. Ячейка, PDF форма.\n getStateOfChangeGrouping(node, options, priceType) {\n if (node) {\n let parameters = {}\n\n // Eсли price есть значит функция вызывается из формы, иначе она вызывается из ячейки.\n if (priceType) {\n if (priceType === 'value') {\n // Текущая цена для клиента .\n const currentValue = Noodl.Variables.documentFormFuncs.getTotalValue(node, options)\n\n // Прошлая цена для клиента.\n const pastValue = Noodl.Variables.documentFormFuncs.getPastTotalValue(node, options)\n\n if (currentValue !== pastValue) {\n parameters.isChange = true\n parameters.color = 'orange'\n } else if (currentValue === pastValue) {\n parameters.isChange = false\n parameters.color = 'black'\n }\n } else if (priceType === 'withMarkup') {\n // Текущая цена для клиента .\n const currentWithMarkup = Noodl.Variables.documentFormFuncs.getTotalWithMarkup(node, options)\n\n // Прошлая цена для клиента.\n const pastWithMarkup = Noodl.Variables.documentFormFuncs.getPastTotalWithMarkup(node, options)\n\n if (currentWithMarkup !== pastWithMarkup) {\n parameters.isChange = true\n parameters.color = 'orange'\n } else if (currentWithMarkup === pastWithMarkup) {\n options.isChange = false\n parameters.color = 'black'\n }\n }\n } else if (!priceType) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n\n const values = {\n currentQuantity: 0,\n pastQuantity: 0,\n currentValue: 0,\n currentTotalValue: 0,\n pastValue: 0,\n pastTotalValue: 0,\n currentWithMarkup: 0,\n currentTotalWithMarkup: 0,\n pastWithMarkup: 0,\n pastTotalWithMarkup: 0\n }\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.getHistory(1)[0].metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'deleted') {\n values.currentQuantity = values.currentQuantity + descendant.content.price.quantity\n\n values.currentValue = values.currentValue + descendant.content.price.value\n values.currentTotalValue = values.currentTotalValue + descendant.content.price.totalValue\n\n values.currentWithMarkup = values.currentWithMarkup + descendant.content.price.withMarkup\n values.currentTotalWithMarkup = values.currentTotalWithMarkup + descendant.content.price.totalWithMarkup\n }\n\n const pastHistoryItem = descendant.getHistory(100)\n .find(item => item.metaData?.[options.fieldNameInMetaData]?.[documentId] === \"notChanged\"\n || item.metaData?.[options.fieldNameInMetaData]?.[documentId] === 'added')\n\n if (pastHistoryItem.metaData?.[options.fieldNameInMetaData]?.[documentId] !== 'added') {\n values.pastQuantity = values.pastQuantity + pastHistoryItem.item.content.price.quantity\n\n values.pastValue = values.pastValue + pastHistoryItem.item.content.price.value\n values.pastTotalValue = values.pastTotalValue + pastHistoryItem.item.content.price.totalValue\n\n values.pastWithMarkup = values.pastWithMarkup + pastHistoryItem.item.content.price.withMarkup\n values.pastTotalWithMarkup = values.pastTotalWithMarkup + pastHistoryItem.item.content.price.totalWithMarkup\n }\n }\n\n parameters = {\n quantity: {\n isChangeQuantity: this.getParameterForGrouping(values.currentQuantity, values.pastQuantity).isChange,\n colorPerOne: this.getParameterForGrouping(values.currentQuantity, values.pastQuantity).color\n },\n value: {\n isChangePerOne: this.getParameterForGrouping(values.currentValue, values.pastValue).isChange,\n colorPerOne: this.getParameterForGrouping(values.currentValue, values.pastValue).color,\n isChangePerAllQuantity: this.getParameterForGrouping(values.currentTotalValue, values.pastTotalValue).isChange,\n colorPerAllQuantity: this.getParameterForGrouping(values.currentTotalValue, values.pastTotalValue).color,\n },\n withMarkup: {\n isChangePerOne: this.getParameterForGrouping(values.currentWithMarkup, values.pastWithMarkup).isChange,\n colorPerOne: this.getParameterForGrouping(values.currentWithMarkup, values.pastWithMarkup).color,\n isChangePerAllQuantity: this.getParameterForGrouping(values.currentTotalWithMarkup, values.pastTotalWithMarkup).isChange,\n colorPerAllQuantity: this.getParameterForGrouping(values.currentTotalWithMarkup, values.pastTotalWithMarkup).color,\n },\n }\n }\n\n return parameters\n }\n },\n // Доп функция для getStateOfChangeGrouping(node, priceType)\n getParameterForGrouping(current, past,) {\n let parameter = {}\n\n if (current !== past) {\n parameter.isChange = true\n } else if (current === past) {\n parameter.isChange = false\n }\n\n return parameter\n },\n // Получить состяние измененности для айтема. Ячейка, PDF форма.\n getStatesOfChangeItem(node, options) {\n if (node) {\n const documentId = node.dbClass !== options.dbClassDocument\n ? Noodl.Variables.documentFormFuncs.getParentDocumentId(node, options.dbClassDocument)\n : node.itemId\n const item = node.item()\n\n if (item && documentId) {\n // прошлый айтем из истории\n const pastHistoryItem = item.getHistory(100).find(item => item.metaData?.[options.fieldNameInMetaData]?.[documentId] === \"notChanged\"\n || !item.metaData?.[options.fieldNameInMetaData]?.[documentId])\n\n const values = {\n currentQuantity: item.content.price.quantity,\n pastQuantity: pastHistoryItem?.item?.content?.price?.quantity,\n currentValue: item.content.price.value,\n currentTotalValue: item.content.price.value * item.content.price.quantity || 0,\n pastValue: pastHistoryItem?.item?.content?.price?.value,\n pastTotalValue: pastHistoryItem?.item?.content?.price?.value * pastHistoryItem?.item?.content?.price?.quantity || 0,\n currentWithMarkup: item.content.price.withMarkup,\n currentTotalWithMarkup: item.content.price.withMarkup * item.content.price.quantity || 0,\n pastWithMarkup: pastHistoryItem?.item?.content?.price?.withMarkup,\n pastTotalWithMarkup: pastHistoryItem?.item?.content?.price?.withMarkup * pastHistoryItem?.item?.content?.price?.quantity || 0\n }\n\n // состояние айтема\n const changeState = item.getHistory(1)[0].metaData?.[options.fieldNameInMetaData]?.[documentId]\n ? item.getHistory(1)[0].metaData?.[options.fieldNameInMetaData]?.[documentId] : \"notChanged\"\n\n let parameters = {\n quantity: {\n isChangeQuantity: this.getParameterForItem(changeState, values.currentQuantity, values.pastQuantity).isChange,\n colorPerOne: this.getParameterForItem(changeState, values.currentQuantity, values.pastQuantity).color\n },\n value: {\n isChangePerOne: this.getParameterForItem(changeState, values.currentValue, values.pastValue).isChange,\n colorPerOne: this.getParameterForItem(changeState, values.currentValue, values.pastValue).color,\n isChangePerAllQuantity: this.getParameterForItem(changeState, values.currentTotalValue, values.pastTotalValue).isChange,\n colorPerAllQuantity: this.getParameterForItem(changeState, values.currentTotalValue, values.pastTotalValue).color,\n },\n withMarkup: {\n isChangePerOne: this.getParameterForItem(changeState, values.currentWithMarkup, values.pastWithMarkup).isChange,\n colorPerOne: this.getParameterForItem(changeState, values.currentWithMarkup, values.pastWithMarkup).color,\n isChangePerAllQuantity: this.getParameterForItem(changeState, values.currentTotalWithMarkup, values.pastTotalWithMarkup).isChange,\n colorPerAllQuantity: this.getParameterForItem(changeState, values.currentTotalWithMarkup, values.pastTotalWithMarkup).color,\n },\n }\n\n return parameters\n }\n }\n },\n // Доп функция для getStatesOfChangeItem(node) \n getParameterForItem(changeState, current, past,) {\n let parameter = { isChange: false, color: 'black' }\n\n if (changeState === 'changed' && current !== past) {\n parameter.color = 'orange'\n parameter.isChange = true\n } else if (changeState === 'changed' && current === past) {\n parameter.color = 'black'\n } else if (changeState === 'added') {\n parameter.color = 'green'\n parameter.isChange = true\n } else if (changeState === 'deleted') {\n parameter.isChange = true\n parameter.color = 'red'\n }\n\n return parameter\n }\n\n}\n\n"},"ports":[],"children":[]},{"id":"11c0ed9e-2dbf-f58f-b51b-0f742c007f98","type":"JavaScriptFunction","parameters":{"functionScript":"Noodl.Variables.companyCards = [\r\n // Мастериская ремонтов\r\n {\r\n // Наименование организации, ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \r\n name: 'ООО \"МАСТЕРСКАЯ РЕМОНТОВ\"',\r\n // ИНН\r\n taxpayerIdentificationNumber: '3811135572',\r\n // КПП\r\n registrationNumber: '381101001',\r\n // ОГРН\r\n ogrn: '1093850031802',\r\n // ОКПО\r\n okpo: '64844391',\r\n // ОКТМО\r\n oktmo: '25701000001',\r\n // Юридический адрес\r\n legalAddress: 'РОССИЯ, обл ИРКУТСКАЯ, г ИРКУТСК, ул БАЙКАЛЬСКАЯ, ДОМ 208, офис 5',\r\n // Почтовый индекс\r\n postalCode: '664075',\r\n // Расчетный счет\r\n bankAccountNumber: '40702810412500007019',\r\n // Название банка\r\n bankName: 'ООО \"Банк Точка\"',\r\n // БИК\r\n bic: '044525104',\r\n // Корр. счет\r\n correspondentAccount: '30101810745374525104',\r\n // Город\r\n city: 'Москва',\r\n // Тел\r\n phone: '8-902-764-08-06',\r\n //E-mail\r\n email: 'main.rasko@gmail.com',\r\n id: 'mr',\r\n },\r\n // Распутин Антон Николаевич\r\n {\r\n // Наименование организации, Индивидуальный предприниматель \r\n name: 'ИП Распутин Антон Николаевич',\r\n // Расчетный счет\r\n bankAccountNumber: '40802810901500298789',\r\n // Название банка\r\n bankName: 'ООО \"Банк Точка\"',\r\n // БИК\r\n bic: '044525104',\r\n // Корр. счет\r\n correspondentAccount: '30101810745374525104',\r\n // Город\r\n city: 'Москва',\r\n // Тел\r\n phone: '8-902-516-98-96',\r\n //E-mail\r\n email: 'rasko-home38@yandex.ru',\r\n id: 'ar',\r\n }\r\n]"},"ports":[],"children":[]},{"id":"a9932ca7-0b9e-4f30-0b95-9cdec7767b4e","type":"JavaScriptFunction","parameters":{"functionScript":"const { numbro, remeda, dayjs } = R.libs\nconst format = { thousandSeparated: true, mantissa: 2 }\n\nNoodl.Variables.documentFormFuncsDataCopyingModel = {\n // Получаем агрегацию себестоимости.\n getTotalValue: (node, options) => {\n if (node) {\n let totalValue = 0\n // Получаем потомков.\n const descendants = node.descendants(options.dbClassDescendants)\n // Если потомки есть, перебираем их.\n if (descendants?.length) for (const descendant of descendants) {\n // Если статус не Удален у потомка, то слаживаем стоимость. \n // (Нам не нужно складывать в текущую стоимость сумму той работы которая удалена)\n if (descendant.states?.change?.value !== 'deleted') {\n totalValue = totalValue + (descendant.content.price.value * descendant.content.price.quantity)\n }\n }\n\n return numbro(totalValue).format(format)\n }\n },\n // Получаем прошлую агрегацию себестоимости.\n getPastTotalValue(node, options) {\n if (node) {\n let pastTotalValue = 0\n // Получаем потомков.\n const descendants = node.descendants(options.dbClassDescendants)\n\n // Если нашлись потомки, начинаем их перебирать.\n if (descendants?.length) for (const descendant of descendants) {\n // Сделать реафкторинг\n if (descendant.states?.change.value === \"notChanged\") {\n pastTotalValue = pastTotalValue + (descendant.content.price.value * descendant.content.price.quantity)\n } else {\n // прошлый айтем из истории\n const pastHistoryItem = descendant.getHistory(100)?.length\n // Ищем айтем в истории тот который со статусом 'notChanged', 'added'. Или Берем первый айтем из истории.\n ? descendant.getHistory(100).find(u => u.item.states?.change.value === \"notChanged\"\n || u.item.states?.change.value === \"added\") \n : { item: descendant } \n \n // Если нашелся айтем в истории\n if (pastHistoryItem) {\n // Если статус не равен 'Добавлен', значит складываем, иначе не складываем.\n // (Нам не нужно складывать в прошлую стоимость сумму той работы которая добавлена, потому что в прошлой сумме работа еще не была добавлена)\n if (descendant.states?.change.value !== 'added') {\n pastTotalValue = pastTotalValue + (pastHistoryItem.item.content.price.value * pastHistoryItem.item.content.price.quantity)\n }\n } \n }\n }\n\n return numbro(pastTotalValue).format(format)\n }\n },\n // Получаем текущую MD\n getMD(node, options) {\n if (node) {\n const totalWithMarkup = remeda.sumBy(node.descendants(options.dbClassDescendants)\n .filter(i => i.states?.change?.value !== 'deleted'), (i) =>\n (i.content.price?.quantity || 0) * (i.content.price?.withMarkup || 0))\n const totalValue = remeda.sumBy(node.descendants(options.dbClassDescendants)\n .filter(i => i.states?.change?.value !== 'deleted'), (i) =>\n (i.content.price?.quantity || 0) * (i.content.price?.value || 0))\n return numbro(totalWithMarkup - totalValue).format(format)\n }\n },\n // Получаем прошлую MD\n getPastMD(node, options) {\n if (node) {\n let pastTotalValue = 0\n let pastTotalWithMarkup = 0\n // Получаем потомков.\n const descendants = node.descendants(options.dbClassDescendants)\n\n // Если нашлись потомки, начинаем их перебирать.\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change.value === \"notChanged\") {\n pastTotalValue = pastTotalValue + (descendant.content.price.value * descendant.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n } else {\n // прошлый айтем из истории\n const pastHistoryItem = descendant.getHistory(100)?.length\n // Ищем айтем в истории тот который со статусом 'notChanged', 'added'. Или Берем первый айтем из истории.\n ? descendant.getHistory(100).find(u => u.item.states?.change.value === \"notChanged\"\n || u.item.states?.change.value === \"added\") \n : { item: descendant } \n\n // Если нашелся айтем в истории\n if (pastHistoryItem) {\n // Если статус не равен 'Добавлен', значит складываем, иначе не складываем.\n // (Нам не нужно складывать в прошлую стоимость сумму той работы которая добавлена, потому что в прошлой сумме работа еще не была добавлена)\n if (descendant.states?.change.value !== 'added') {\n pastTotalValue = pastTotalValue + (pastHistoryItem.item.content.price.value * pastHistoryItem.item.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (pastHistoryItem.item.content.price.withMarkup * pastHistoryItem.item.content.price.quantity)\n }\n }\n }\n }\n\n return numbro(pastTotalWithMarkup - pastTotalValue).format(format)\n }\n },\n // Получаем текущую MD в процентах\n getMdPercent(node, options) {\n if (node) {\n const totalWithMarkup = remeda.sumBy(node.descendants(options.dbClassDescendants)\n .filter(i => i.states?.change?.value !== 'deleted'), (i) =>\n (i.content.price?.quantity || 0) * (i.content.price?.withMarkup || 0))\n const totalValue = remeda.sumBy(node.descendants(options.dbClassDescendants)\n .filter(i => i.states?.change?.value !== 'deleted'), (i) =>\n (i.content.price?.quantity || 0) * (i.content.price?.value || 0))\n // Проверка, чтобы избежать деления на ноль\n if (!totalWithMarkup) return numbro(0).format(format)\n\n const result = (totalWithMarkup - totalValue) / totalWithMarkup * 100\n\n // Проверка на NaN и Infinity\n if (isNaN(result) || !isFinite(result)) return numbro(0).format(format)\n\n return numbro(result).format(format)\n }\n },\n // Получаем прошлую MD в процентах\n getPastMdPercent(node, options) {\n if (node) {\n let pastTotalValue = 0\n let pastTotalWithMarkup = 0\n // Получаем потомков.\n const descendants = node.descendants(options.dbClassDescendants)\n\n // Если нашлись потомки, начинаем их перебирать.\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change.value === \"notChanged\") {\n pastTotalValue = pastTotalValue + (descendant.content.price.value * descendant.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n } else {\n // прошлый айтем из истории\n const pastHistoryItem = descendant.getHistory(100)?.length\n // Ищем айтем в истории тот который со статусом 'notChanged', 'added'. Или Берем первый айтем из истории.\n ? descendant.getHistory(100).find(u => u.item.states?.change.value === \"notChanged\"\n || u.item.states?.change.value === \"added\") \n : { item: descendant } \n\n // Если нашелся айтем в истории\n if (pastHistoryItem) {\n // Если статус не равен 'Добавлен', значит складываем, иначе не складываем.\n // (Нам не нужно складывать в прошлую стоимость сумму той работы которая добавлена, потому что в прошлой сумме работа еще не была добавлена)\n if (descendant.states?.change.value !== 'added') {\n pastTotalValue = pastTotalValue + (pastHistoryItem.item.content.price.value * pastHistoryItem.item.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (pastHistoryItem.item.content.price.withMarkup * pastHistoryItem.item.content.price.quantity)\n }\n }\n }\n }\n\n // Проверка, чтобы избежать деления на ноль\n if (!pastTotalWithMarkup) return numbro(0).format(format)\n\n const result = (pastTotalWithMarkup - pastTotalValue) / pastTotalWithMarkup * 100\n\n // Проверка на NaN и Infinity\n if (isNaN(result) || !isFinite(result)) return numbro(0).format(format)\n\n return numbro(result).format(format)\n }\n },\n // Получаем агрегацию цены для клиента.\n getTotalWithMarkup(node, options) {\n if (node) {\n let totalWithMarkup = 0\n const descendants = node.descendants(options.dbClassDescendants)\n // Если потомки есть, перебираем их.\n if (descendants?.length) for (const descendant of descendants) {\n // Если статус не Удален у потомка, то слаживаем стоимость. \n // (Нам не нужно складывать в текущую стоимость сумму той работы которая удалена)\n if (descendant.states?.change?.value !== 'deleted') {\n totalWithMarkup = totalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n }\n }\n\n return numbro(totalWithMarkup).format(format)\n }\n },\n // Получаем прошлую агрегацию цены для клиента.\n getPastTotalWithMarkup(node, options) {\n if (node) {\n let pastTotalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change.value === \"notChanged\") {\n pastTotalWithMarkup = pastTotalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n } else {\n // прошлый айтем из истории\n const pastHistoryItem = descendant.getHistory(100)?.length\n // Ищем айтем в истории тот который со статусом 'notChanged', 'added' или нету статуса (последнее условие на всякий случай).\n ? descendant.getHistory(100).find(u => u.item.states?.change.value === \"notChanged\"\n || u.item.states?.change.value === \"added\") \n : { item: descendant } \n\n // Если нашелся айтем в истории\n if (pastHistoryItem) {\n // Если статус не равен 'Добавлен', значит складываем, иначе не складываем.\n // (Нам не нужно складывать в прошлую стоимость сумму той работы которая добавлена, потому что в прошлой сумме работа еще не была добавлена)\n if (descendant.states?.change.value !== 'added') {\n pastTotalWithMarkup = pastTotalWithMarkup + (pastHistoryItem.item.content.price.withMarkup * pastHistoryItem.item.content.price.quantity)\n }\n } \n }\n }\n\n return numbro(pastTotalWithMarkup).format(format)\n }\n },\n // Получаем текущую MD в день\n getMdDay(node, options) {\n const descendants = node.descendants(options.dbClassDescendants).filter(i => i.states?.change?.value !== 'deleted')\n\n const startDates = descendants.map(i => i.getRef('project-work')?.content.date?.start).filter(Boolean).map(i => dayjs(i).startOf('d'))\n const endDates = descendants.map(i => i.getRef('project-work')?.content.date?.end).filter(Boolean).map(i => dayjs(i).endOf('d'))\n\n const minDate = dayjs.min(startDates)\n const maxDate = dayjs.max(endDates)\n\n const totalWithMarkup = remeda.sumBy(descendants, (i) =>\n (i.content.price?.quantity || 0) * (i.content.price?.withMarkup || 0))\n const totalValue = remeda.sumBy(descendants, (i) =>\n (i.content.price?.quantity || 0) * (i.content.price?.value || 0))\n\n let days = Math.ceil(dayjs.duration(maxDate - minDate).asDays())\n\n if (days && totalWithMarkup && totalValue) return numbro((totalWithMarkup - totalValue) / days).format(format)\n else return numbro(0).format(format)\n },\n // Получаем прошлую MD в день\n getPastMdDay(node, options) {\n if (node) {\n // Получаем потомков.\n const descendants = node.descendants(options.dbClassDescendants)\n\n let pastTotalValue = 0\n let pastTotalWithMarkup = 0\n\n const startDates = []\n const endDates = []\n\n // Если нашлись потомки, начинаем их перебирать.\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change.value === \"notChanged\") {\n pastTotalValue = pastTotalValue + (descendant.content.price.value * descendant.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n\n startDates.push(descendant.getRef('project-work')?.content.date?.start)\n endDates.push(descendant.getRef('project-work')?.content.date?.end)\n } else {\n // прошлый айтем из истории\n const pastHistoryItem = descendant.getHistory(100)?.length\n // Ищем айтем в истории тот который со статусом 'notChanged', 'added'. Или Берем первый айтем из истории.\n ? descendant.getHistory(100).find(u => u.item.states?.change.value === \"notChanged\"\n || u.item.states?.change.value === \"added\") \n : { item: descendant } \n // Если нашелся айтем в истории\n if (pastHistoryItem) {\n // Если статус не равен 'Добавлен', значит складываем, иначе не складываем.\n // (Нам не нужно складывать в прошлую стоимость сумму той работы которая добавлена, потому что в прошлой сумме работа еще не была добавлена)\n if (descendant.states?.change.value !== 'added') {\n pastTotalValue = pastTotalValue + (pastHistoryItem.item.content.price.value * pastHistoryItem.item.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (pastHistoryItem.item.content.price.withMarkup * pastHistoryItem.item.content.price.quantity)\n\n startDates.push(descendant.getRef('project-work')?.content.date?.start)\n endDates.push(descendant.getRef('project-work')?.content.date?.end)\n \n }\n }\n }\n }\n\n const minDate = startDates?.length ? dayjs.min(startDates.filter(Boolean)?.map(i => dayjs(i)))?.startOf('d') : false\n const maxDate = endDates?.length ? dayjs.max(endDates.filter(Boolean)?.map(i => dayjs(i)))?.endOf('d') : false\n\n let days = Math.ceil(dayjs.duration(maxDate - minDate).asDays())\n\n if (days && pastTotalWithMarkup && pastTotalValue) return numbro((pastTotalWithMarkup - pastTotalValue) / days).format(format)\n else return numbro(0).format(format)\n }\n },\n // Получаем скидку\n getMarkup(node, options) {\n if (node) {\n let totalValue = 0\n let totalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change?.value !== 'deleted') {\n totalValue = totalValue + (descendant.content.price.value * descendant.content.price.quantity)\n totalWithMarkup = totalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n }\n }\n\n // Проверка на деление на ноль\n if (totalValue === 0) {\n return numbro(0).format(format); // Возвращаем 0, если totalValue равен 0\n }\n\n const markup = Noodl.Variables.functions.getMarkup(totalValue, totalWithMarkup) || 0;\n\n // Проверка на Infinity или -Infinity\n if (!isFinite(markup)) {\n return numbro(0).format(format); // Или любое другое значение по умолчанию\n }\n\n return numbro(markup).format(format)\n }\n },\n // Получаем прошлую скидку\n getPastMarkup(node, options) {\n if (node) {\n\n let pastTotalValue = 0\n let pastTotalWithMarkup = 0\n\n const descendants = node.descendants(options.dbClassDescendants)\n\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change.value === \"notChanged\") {\n pastTotalValue = pastTotalValue + (descendant.content.price.value * descendant.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (descendant.content.price.withMarkup * descendant.content.price.quantity)\n } else {\n const pastHistoryItem = descendant.getHistory(100)?.length\n ? descendant.getHistory(100).find(u => u.item.states?.change.value === \"notChanged\"\n || u.item.states?.change.value === \"added\") \n : { item: descendant }\n\n if (pastHistoryItem) {\n if (descendant.states?.change.value !== 'added') {\n pastTotalValue = pastTotalValue + (pastHistoryItem.item.content.price.value * pastHistoryItem.item.content.price.quantity)\n pastTotalWithMarkup = pastTotalWithMarkup + (pastHistoryItem.item.content.price.withMarkup * pastHistoryItem.item.content.price.quantity)\n }\n } \n }\n }\n\n // Проверка на деление на ноль\n if (pastTotalValue === 0) {\n return numbro(0).format(format); // Возвращаем 0, если totalValue равен 0\n }\n\n const pastMarkup = Noodl.Variables.functions.getMarkup(pastTotalValue, pastTotalWithMarkup) || 0;\n\n // Проверка на Infinity или -Infinity\n if (!isFinite(pastMarkup)) {\n return numbro(0).format(format); // Или любое другое значение по умолчанию\n }\n\n return numbro(pastMarkup).format(format)\n }\n },\n // Получить id родительского документа\n getParentDocumentId: (node, dbClassDocument) => {\n try {\n if (!node) {\n return null\n } else {\n const ancestors = node.ancestors(dbClassDocument)\n\n const documentId = ancestors[0].id\n\n if (!documentId) {\n return null\n }\n\n return documentId\n }\n\n } catch (error) {\n return null\n }\n },\n getDbClassParentDocument: (node) => {\n try {\n if (!node) {\n return null\n } else {\n if (node.item()?.content?.order) {\n return node.item().dbClass\n } else {\n const parentDocumentNode = node.ancestorNodes().find(i => i.item()?.content?.order)\n\n if (!parentDocumentNode.dbClass) {\n return null;\n }\n\n return parentDocumentNode.dbClass\n }\n }\n } catch (error) {\n return null\n }\n },\n // Сформировать опцию на лету, из полученной ноды.\n getOptions(node) {\n if (node) {\n const dbClassDocument = Noodl.Variables.documentFormFuncsDataCopyingModel.getDbClassParentDocument(node)\n let dbClassDescendants = ''\n\n if (dbClassDocument === 'calculation') {\n dbClassDescendants = 'project-calculation-work'\n } else if (dbClassDocument === 'project-zn') {\n dbClassDescendants = 'project-zn-work'\n }\n\n return {\n dbClassDocument: dbClassDocument,\n dbClassDescendants: dbClassDescendants,\n }\n }\n },\n isChange(node, options) {\n if (node) {\n const descendants = node.descendants(options.dbClassDescendants)\n if (descendants?.length) for (const descendant of descendants) {\n if (descendant.states?.change?.value !== 'notChanged') {\n return true\n }\n }\n return false\n }\n },\n}\n\n"},"ports":[],"children":[]},{"id":"148b90b3-baea-b059-2087-5a51981bf354","type":"JavaScriptFunction","parameters":{"functionScript":"/* const createPerformanceTimer = () => {\r\n // Наша капсула времени для хранения всех меток\r\n const timeMarks = new Map();\r\n\r\n return {\r\n start: (label = 'Default') => {\r\n timeMarks.set(label, {\r\n startTime: performance.now(),\r\n memoryStart: process.memoryUsage().heapUsed // если в Node.js\r\n });\r\n console.log(`\r\n 🚀 Поехали: ${label}\r\n ⏰ Время старта: ${new Date().toLocaleTimeString()}\r\n `);\r\n },\r\n\r\n end: (label = 'Default') => {\r\n if (!timeMarks.has(label)) {\r\n console.log(`Йоу, чел! Ты забыл запустить таймер для ${label} 🤦‍♂️`);\r\n return;\r\n }\r\n\r\n const endTime = performance.now();\r\n const { startTime, memoryStart } = timeMarks.get(label);\r\n const duration = endTime - startTime;\r\n\r\n // Для Node.js можно добавить информацию о памяти\r\n const memoryEnd = process.memoryUsage().heapUsed;\r\n const memoryDiff = (memoryEnd - memoryStart) / 1024 / 1024; // в МБ\r\n\r\n console.log(`\r\n 📊 Результаты для: ${label}\r\n ⏱️ Время выполнения: ${duration.toFixed(2)} мс\r\n ⚡ В секундах: ${(duration / 1000).toFixed(3)} сек\r\n ${memoryDiff ? `🧠 Использовано памяти: ${memoryDiff.toFixed(2)} MB` : ''}\r\n `);\r\n\r\n timeMarks.delete(label); // Чистим за собой\r\n },\r\n\r\n // Бонусная функция для замера нескольких прогонов\r\n benchmark: (fn, iterations = 1000, label = 'Benchmark') => {\r\n console.log(`🏃‍♂️ Начинаем бенчмарк: ${iterations} итераций`);\r\n \r\n const times = [];\r\n for (let i = 0; i < iterations; i++) {\r\n const start = performance.now();\r\n fn();\r\n times.push(performance.now() - start);\r\n }\r\n\r\n const average = times.reduce((a, b) => a + b, 0) / times.length;\r\n const min = Math.min(...times);\r\n const max = Math.max(...times);\r\n\r\n console.log(`\r\n 🎯 Результаты бенчмарка для ${label}:\r\n 📈 Среднее время: ${average.toFixed(2)} мс\r\n ⬇️ Минимальное: ${min.toFixed(2)} мс\r\n ⬆️ Максимальное: ${max.toFixed(2)} мс\r\n `);\r\n }\r\n };\r\n};\r\n\r\n// Использование:\r\nconst timer = createPerformanceTimer();\r\n\r\n// Простой замер\r\ntimer.start('МойКрутойКод');\r\nfor(let i = 0; i < 1000000; i++) {\r\n // что-то делаем\r\n}\r\ntimer.end('МойКрутойКод');\r\n\r\n// Бенчмарк функции\r\ntimer.benchmark(() => {\r\n // твой код для тестирования\r\n let x = 0;\r\n for(let i = 0; i < 1000; i++) {\r\n x += i;\r\n }\r\n}, 100, 'Тест сложения'); */"},"ports":[],"children":[]},{"id":"d0911c80-300e-bed6-7476-616a585864b4","type":"JavaScriptFunction","parameters":{"functionScript":"const { numbro, remeda, dayjs } = R.libs\nconst { sumBy } = R.libs.remeda\nconst format = { thousandSeparated: true, mantissa: 2 }\nconst documentDbClasses = ['client-acceptance-act', 'brigade-completion-act', 'progress-record']\n\nNoodl.Variables.documentFormFuncsHierarchyModel = {\n // Функция отфильтровывает добавленные работы\n filterAddedWork(works, parentDocumentItem) {\n return works.filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value !== 'added'\n )\n },\n // Функция отфильтровывает удаленные работы\n // Функция отфильтровывает добавленные работы\n filterDeletedWork(works, parentDocumentItem) {\n return works.filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value !== 'deleted'\n )\n },\n // Возвращает себестоимость закрытую Актом или Записью прогресса\n getRealTotalValue(node) {\n const { getParentDocumentItem, filterDeletedWork } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n const totalValue = sumBy(\n filterDeletedWork(node.descendants('project-work'), parentDocumentItem),\n (work) => {\n const realQuantity = work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity || 0\n const value = work?.content?.price?.value || 0\n return realQuantity * value\n }\n )\n\n return totalValue ? numbro(totalValue).format(format) : numbro(0).format(format)\n },\n // Возвращает прошлую себестоимость закрытую Актом или Записью прогресса\n getRealPastTotalValue(node) {\n const { getParentDocumentItem, filterAddedWork } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n const pastTotalValue = sumBy(\n filterAddedWork(node.descendants('project-work'), parentDocumentItem),\n (work) => {\n const pastHistoryItem = Noodl.Variables.documentFormFuncsHierarchyModel.getPastHistoryItem(work, parentDocumentItem)\n const realQuantity = pastHistoryItem?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity || 0\n const value = pastHistoryItem?.content?.price?.value || 0\n return realQuantity * value\n }\n )\n return pastTotalValue ? numbro(pastTotalValue).format(format) : numbro(0).format(format)\n },\n // Возвращает себестоимость закрытую Актом или Записью прогресса\n getRealTotalWithMarkup(node) {\n const { getParentDocumentItem, filterDeletedWork } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n const totalWithMarkup = sumBy(\n filterDeletedWork(node.descendants('project-work'), parentDocumentItem),\n (work) => {\n const realQuantity = work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity || 0\n const withMarkup = work.content.price?.withMarkup || 0\n return realQuantity * withMarkup\n }\n )\n return totalWithMarkup ? numbro(totalWithMarkup).format(format) : numbro(0).format(format)\n },\n // Возвращает прошлую себестоимость закрытую Актом или Записью прогресса\n getRealPastTotalWithMarkup(node) {\n const { getParentDocumentItem, filterAddedWork } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n const pastTotalWithMarkup = sumBy(\n filterAddedWork(node.descendants('project-work'), parentDocumentItem),\n (work) => {\n const pastHistoryItem = Noodl.Variables.documentFormFuncsHierarchyModel.getPastHistoryItem(work, parentDocumentItem)\n const realQuantity = pastHistoryItem.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity || 0\n const withMarkup = pastHistoryItem.content.price?.withMarkup || 0\n return realQuantity * withMarkup\n }\n )\n return pastTotalWithMarkup ? numbro(pastTotalWithMarkup).format(format) : numbro(0).format(format)\n },\n // Получаем текущую MD\n getRealMD(node, options) {\n if (node) {\n const parentDocumentId = Noodl.Variables.documentFormFuncsHierarchyModel.getParentDocumentId(node, 'progress-record')\n\n // Фильтр по работам со статусом 'deleted', пока зкоментирован, потмо нужно будет придумывать, что-то.\n const totalWithMarkup = remeda.sumBy(node.descendants(options.dbClassDescendants)\n /* .filter(i => i.states?.change?.value !== 'deleted') */, (i) =>\n (i.content.progress?.['progress-record'][parentDocumentId]?.price?.quantity || 0) * (i.content.price?.withMarkup || 0))\n const totalValue = remeda.sumBy(node.descendants(options.dbClassDescendants)\n /* .filter(i => i.states?.change?.value !== 'deleted') */, (i) =>\n (i.content.progress?.['progress-record'][parentDocumentId]?.price?.quantity || 0) * (i.content.price?.value || 0))\n return numbro(totalWithMarkup - totalValue).format(format)\n }\n },\n // Получаем текущую MD в процентах\n getRealMdPercent(node, options) {\n if (node) {\n const parentDocumentId = Noodl.Variables.documentFormFuncsHierarchyModel.getParentDocumentId(node, 'progress-record')\n\n const totalWithMarkup = remeda.sumBy(node.descendants(options.dbClassDescendants)\n /* .filter(i => i.states?.change?.value !== 'deleted') */, (i) =>\n (i.content.progress?.['progress-record'][parentDocumentId]?.price?.quantity || 0) * (i.content.price?.withMarkup || 0))\n const totalValue = remeda.sumBy(node.descendants(options.dbClassDescendants)\n /* .filter(i => i.states?.change?.value !== 'deleted') */, (i) =>\n (i.content.progress?.['progress-record'][parentDocumentId]?.price?.quantity || 0) * (i.content.price?.value || 0))\n // Проверка, чтобы избежать деления на ноль\n if (!totalWithMarkup) return numbro(0).format(format)\n\n const result = (totalWithMarkup - totalValue) / totalWithMarkup * 100\n\n // Проверка на NaN и Infinity\n if (isNaN(result) || !isFinite(result)) return numbro(0).format(format)\n\n return numbro(result).format(format)\n }\n },\n getChangedTotalValue(node) {\n const { getParentDocumentItem, getPastHistoryItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n let totalChange = 0\n\n const descendants = node.descendants('project-work').filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === 'changed'\n )\n\n if (descendants?.length) {\n for (const work of descendants) {\n // прошлый айтем из истории\n const pastHistoryItem = getPastHistoryItem(work, parentDocumentItem)\n\n // текущая цена\n const currentAmount = work.content.price.value * work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n // прошлая цена\n const pastAmount = pastHistoryItem.content.price.value * pastHistoryItem.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n\n const change = currentAmount - pastAmount // Вычисляем изменение\n\n totalChange += change // Суммируем изменения\n }\n }\n return totalChange\n },\n getAddedTotalValue(node) {\n const { getParentDocumentItem, getPastHistoryItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n let totalAdded = 0\n\n const descendants = node.descendants('project-work').filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === 'added'\n )\n\n if (descendants?.length) {\n for (const work of descendants) {\n // текущая цена\n const currentAmount = work.content.price.value * work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n\n totalAdded += currentAmount // Суммируем изменения\n }\n }\n return totalAdded\n },\n getDeletedTotalValue(node) {\n const { getParentDocumentItem, getPastHistoryItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n let totalDeleted = 0\n\n const descendants = node.descendants('project-work').filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === 'deleted'\n )\n\n if (descendants?.length) {\n for (const work of descendants) {\n // текущая цена\n const currentAmount = work.content.price.value * work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n\n totalDeleted += currentAmount // Суммируем изменения\n }\n }\n return totalDeleted\n },\n getChangedTotalWithMarkup(node) {\n const { getParentDocumentItem, getPastHistoryItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n let totalChange = 0\n\n const descendants = node.descendants('project-work').filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === 'changed'\n )\n\n if (descendants?.length) {\n for (const work of descendants) {\n // прошлый айтем из истории\n const pastHistoryItem = getPastHistoryItem(work, parentDocumentItem)\n\n // текущая цена\n const currentAmount = work.content.price.withMarkup * work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n // прошлая цена\n const pastAmount = pastHistoryItem.content.price.withMarkup * pastHistoryItem.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n\n const change = currentAmount - pastAmount // Вычисляем изменение\n\n totalChange += change // Суммируем изменения\n }\n }\n return totalChange\n },\n getAddedTotalWithMarkup(node) {\n const { getParentDocumentItem, getPastHistoryItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n let totalAdded = 0\n\n const descendants = node.descendants('project-work').filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === 'added'\n )\n\n if (descendants?.length) {\n for (const work of descendants) {\n // текущая цена\n const currentAmount = work.content.price.withMarkup * work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n\n totalAdded += currentAmount // Суммируем изменения\n }\n }\n return totalAdded\n },\n getDeletedTotalWithMarkup(node) {\n const { getParentDocumentItem, getPastHistoryItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n const parentDocumentItem = getParentDocumentItem(node)\n\n let totalDeleted = 0\n\n const descendants = node.descendants('project-work').filter(work =>\n work?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === 'deleted'\n )\n\n if (descendants?.length) {\n for (const work of descendants) {\n // текущая цена\n const currentAmount = work.content.price.withMarkup * work.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.price?.quantity\n\n totalDeleted += currentAmount // Суммируем изменения\n }\n }\n return totalDeleted\n },\n /* Эту функцию закомментировал, 24.07.2025 Посмотрим где она используется. по идее предыдущая делает тоже самое\n // Получаем агрегацию себестоимости.\n getRealTotalValue(node, options) {\n if (node) {\n try {\n const parentDocumentId = Noodl.Variables.documentFormFuncsHierarchyModel.getParentDocumentId(node, 'progress-record')\n\n let totalValue = 0\n // Получаем потомков.\n const descendants = node.descendants(options.dbClassDescendants)\n // Если потомки есть, перебираем их.\n if (descendants?.length) for (const descendant of descendants) {\n // Если статус не Удален у потомка, то слаживаем стоимость. \n // (Нам не нужно складывать в текущую стоимость сумму той работы которая удалена)\n // if (descendant.states?.change?.value !== 'deleted') {\n totalValue = totalValue + (descendant.content.price.value * descendant.content.progress?.['progress-record'][parentDocumentId]?.price.quantity)\n // }\n }\n\n return numbro(totalValue).format(format)\n } catch {\n log.error(`Ошибка в методе: getRealTotalValue()`, {\n variable: 'Noodl.Variables.documentFormFuncsHierarchyModel',\n error: error.message,\n })\n R.libs.mantine.MantineError('Ошибка метода!', `getRealTotalValue() error: ${error.message}`);\n\n return null\n }\n }\n }, */\n // Функция возвращает свойство progress с установленными статусами.\n // Используется функция там, где может отредактироваться стоимость работы.\n setHistoryStatusInWorks(item, stateValue) {\n // Если нет прогресса - досвидос, возвращаем пустой объект\n if (!item.content.progress) return false\n\n // Деструктурируем наш progress из item\n const { clone } = R.libs.just\n const progress = item.content.progress\n\n // Функция для установки статуса в документ\n const setStatus = (doc) => {\n return Object.entries(doc || {}).reduce((acc, [id, data]) => {\n acc[id] = {\n // ...data,\n states: {\n change: {\n value: stateValue\n }\n }\n }\n return acc\n }, {})\n }\n\n // Собираем новый объект progress, проверяя наличие каждого свойства\n const result = {}\n\n // Проверяем и добавляем только существующие свойства\n if ('client-acceptance-act' in progress) {\n result['client-acceptance-act'] = setStatus(clone(progress['client-acceptance-act']))\n }\n\n if ('brigade-completion-act' in progress) {\n result['brigade-completion-act'] = setStatus(clone(progress['brigade-completion-act']))\n }\n\n if ('progress-record' in progress) {\n result['progress-record'] = setStatus(clone(progress['progress-record']))\n }\n\n return result\n },\n getParentDocumentItem(node) {\n try {\n if (!node) {\n return null\n } else {\n if (documentDbClasses.includes(node.dbClass)) {\n return node.item()\n } else {\n const parentDocumentNode = node.ancestorNodes().find(n => documentDbClasses.includes(n.dbClass))\n\n if (!parentDocumentNode) {\n return null;\n }\n\n return parentDocumentNode.item()\n }\n }\n } catch (error) {\n return null\n }\n },\n // Получить id родительского документа\n getParentDocumentId(node, dbClassDocument) {\n try {\n if (!node) {\n return null\n } else {\n if (node.dbClass === dbClassDocument) return node.itemId\n\n const ancestors = node.ancestors(dbClassDocument)\n\n const documentId = ancestors[0].id\n\n if (!documentId) {\n return null\n }\n\n return documentId\n }\n\n } catch (error) {\n return null\n }\n },\n getParentDocumentDbClass(node) {\n try {\n if (!node) {\n return null\n } else {\n if (documentDbClasses.includes(node.dbClass)) {\n return node.item().dbClass\n } else {\n const parentDocumentNode = node.ancestorNodes().find(n => documentDbClasses.includes(n.dbClass))\n\n if (!parentDocumentNode.dbClass) {\n return null;\n }\n\n return parentDocumentNode.dbClass\n }\n }\n } catch (error) {\n return null\n }\n },\n getPastHistoryItem(item, parentDocumentItem) {\n // Получаем текущий статус\n const currentState = Noodl.Variables.documentFormFuncsHierarchyModel.getCurrentChangeState(item, parentDocumentItem);\n\n // Если 'notChanged' — past = current (ничего не изменилось)\n if (currentState === 'notChanged') {\n return item;\n }\n // Находим прошлый айтем, по статусу 'notChanged'\n\n const pastHistoryItem = item.getHistory(100).find(item => item.item?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === \"notChanged\"\n || item.item?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value === \"added\"\n || !item?.item?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value)\n\n // Это на случай если статус 'added', 'changed' или вообще нет статуса\n if (!pastHistoryItem) return item\n\n return pastHistoryItem.item\n },\n getCurrentChangeState(item, parentDocumentItem) {\n return item.content.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]?.states?.change?.value\n ? item.content.progress[parentDocumentItem?.dbClass][parentDocumentItem?.id].states.change.value : \"notChanged\"\n },\n // Получить состяние измененности для айтема. Ячейка, PDF форма.\n getStatesOfChangeItem(node, dbClassDocument) {\n try {\n // Валидация входных параметров\n if (!node || !dbClassDocument) {\n return {};\n }\n\n if (node) {\n const documentId = node.dbClass !== dbClassDocument\n ? Noodl.Variables.documentFormFuncsHierarchyModel.getParentDocumentId(node, dbClassDocument)\n : node.itemId\n\n const parentDocumentItem = node.dbClass !== dbClassDocument\n ? Noodl.Variables.documentFormFuncsHierarchyModel.getParentDocumentItem(node, dbClassDocument)\n : node.item()\n\n const item = node.item()\n\n // Подробная проверка наличия необходимых данных\n if (!item?.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id]) {\n return {};\n }\n\n if (item && parentDocumentItem) {\n // Прошлый айтем из истории\n const pastHistoryItem = Noodl.Variables.documentFormFuncsHierarchyModel.getPastHistoryItem(item, parentDocumentItem)\n\n const currentQuantity = item.content.progress[parentDocumentItem.dbClass][parentDocumentItem.id].price?.quantity || 0\n const pastQuantity = pastHistoryItem?.content?.progress?.[parentDocumentItem.dbClass]?.[parentDocumentItem.id]?.price?.quantity || 0\n\n const currentValue = item?.content?.price?.value || 0\n const currentWithMarkup = item?.content?.price?.withMarkup || 0\n\n const pastValue = pastHistoryItem?.content?.price?.value || 0\n const pastWithMarkup = pastHistoryItem?.content?.price?.withMarkup || 0\n\n const values = {\n currentQuantity,\n pastQuantity,\n currentValue,\n currentTotalValue: currentValue * currentQuantity || 0,\n pastValue,\n pastTotalValue: pastValue * pastQuantity || 0,\n currentWithMarkup,\n currentTotalWithMarkup: currentWithMarkup * currentQuantity || 0,\n pastWithMarkup,\n pastTotalWithMarkup: pastWithMarkup * pastQuantity || 0\n }\n\n // Состояние айтема\n const changeState = Noodl.Variables.documentFormFuncsHierarchyModel.getCurrentChangeState(item, parentDocumentItem)\n\n const { getParameterForItem } = Noodl.Variables.documentFormFuncsHierarchyModel\n let parameters = {\n quantity: {\n isChangeQuantity: getParameterForItem(changeState, values.currentQuantity, values.pastQuantity).isChange,\n colorPerOne: getParameterForItem(changeState, values.currentQuantity, values.pastQuantity).color\n },\n value: {\n isChangePerOne: getParameterForItem(changeState, values.currentValue, values.pastValue).isChange,\n colorPerOne: getParameterForItem(changeState, values.currentValue, values.pastValue).color,\n isChangePerAllQuantity: getParameterForItem(changeState, values.currentTotalValue, values.pastTotalValue).isChange,\n colorPerAllQuantity: getParameterForItem(changeState, values.currentTotalValue, values.pastTotalValue).color,\n },\n withMarkup: {\n isChangePerOne: getParameterForItem(changeState, values.currentWithMarkup, values.pastWithMarkup).isChange,\n colorPerOne: getParameterForItem(changeState, values.currentWithMarkup, values.pastWithMarkup).color,\n isChangePerAllQuantity: getParameterForItem(changeState, values.currentTotalWithMarkup, values.pastTotalWithMarkup).isChange,\n colorPerAllQuantity: getParameterForItem(changeState, values.currentTotalWithMarkup, values.pastTotalWithMarkup).color,\n },\n }\n\n return parameters\n }\n }\n return {};\n } catch (e) {\n return {};\n }\n },\n // Доп функция для getStatesOfChangeItem(node) \n getParameterForItem(changeState, current, past,) {\n let parameter = { isChange: false, color: 'black' }\n\n if (changeState === 'changed' && current !== past) {\n parameter.color = 'orange'\n parameter.isChange = true\n } else if (changeState === 'changed' && current === past) {\n parameter.color = 'black'\n } else if (changeState === 'added') {\n parameter.color = 'green'\n parameter.isChange = true\n } else if (changeState === 'deleted') {\n parameter.isChange = true\n parameter.color = 'red'\n }\n\n return parameter\n },\n // Получить состояние измененности во вложенности, для группировок. Ячейка, PDF форма.\n getStateOfChangeGrouping(node, options, priceType) {\n try {\n // Валидация входных параметров\n if (!node) {\n return {};\n }\n\n const parentDocumentItem = Noodl.Variables.documentFormFuncsHierarchyModel.getParentDocumentItem(node)\n if (!parentDocumentItem) {\n return {};\n }\n\n let parameters = {};\n\n // Если price есть значит функция вызывается из формы, иначе она вызывается из ячейки\n if (priceType) {\n if (priceType === 'value') {\n try {\n // Текущая цена для клиента\n const currentValue = Noodl.Variables.documentFormFuncsHierarchyModel.getRealTotalValue(node);\n // Прошлая цена для клиента\n const pastValue = Noodl.Variables.documentFormFuncsHierarchyModel.getRealPastTotalValue(node);\n\n parameters = {\n isChange: currentValue !== pastValue,\n color: currentValue !== pastValue ? 'orange' : 'black'\n };\n } catch (e) {\n return {};\n }\n } else if (priceType === 'withMarkup') {\n try {\n // Текущая цена для клиента\n const currentWithMarkup = Noodl.Variables.documentFormFuncsHierarchyModel.getRealTotalWithMarkup(node);\n // Прошлая цена для клиента\n const pastWithMarkup = Noodl.Variables.documentFormFuncsHierarchyModel.getRealPastTotalWithMarkup(node);\n\n parameters = {\n isChange: currentWithMarkup !== pastWithMarkup,\n color: currentWithMarkup !== pastWithMarkup ? 'orange' : 'black'\n };\n } catch (e) {\n return {};\n }\n }\n } else {\n const values = {\n currentQuantity: 0,\n pastQuantity: 0,\n currentValue: 0,\n currentTotalValue: 0,\n pastValue: 0,\n pastTotalValue: 0,\n currentWithMarkup: 0,\n currentTotalWithMarkup: 0,\n pastWithMarkup: 0,\n pastTotalWithMarkup: 0\n };\n\n const descendants = node.descendants('project-work');\n\n if (descendants?.length) {\n for (const descendant of descendants) {\n try {\n // console.log(descendant.content.name)\n const progress = descendant.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id];\n\n if (!progress) {\n continue;\n }\n\n if (progress.states?.change?.value !== 'deleted') {\n const quantity = progress.price?.quantity || 0;\n values.currentQuantity += quantity;\n\n const price = descendant.content?.price || {};\n values.currentValue += price.value || 0;\n values.currentTotalValue += ((price.value || 0) * quantity);\n\n values.currentWithMarkup += price.withMarkup || 0;\n values.currentTotalWithMarkup += ((price.withMarkup || 0) * quantity);\n }\n\n const pastHistoryItem = Noodl.Variables.documentFormFuncsHierarchyModel.getPastHistoryItem(descendant, parentDocumentItem);\n\n if (progress.states?.change?.value !== 'added' && pastHistoryItem) {\n const pastProgress = pastHistoryItem.content?.progress?.[parentDocumentItem?.dbClass]?.[parentDocumentItem?.id];\n // if (!pastProgress) continue;\n\n const pastQuantity = pastProgress.price?.quantity || 0;\n values.pastQuantity += pastQuantity;\n\n const pastPrice = pastHistoryItem.content?.price || {};\n values.pastValue += pastPrice.value || 0;\n values.pastTotalValue += ((pastPrice.value || 0) * pastQuantity);\n\n values.pastWithMarkup += pastPrice.withMarkup || 0;\n values.pastTotalWithMarkup += ((pastPrice.withMarkup || 0) * pastQuantity);\n }\n // console.log('values: ', values)\n } catch (e) {\n continue;\n }\n }\n }\n\n const { getParameterForGrouping } = Noodl.Variables.documentFormFuncsHierarchyModel;\n\n parameters = {\n quantity: {\n isChangeQuantity: getParameterForGrouping(values.currentQuantity, values.pastQuantity).isChange,\n colorPerOne: getParameterForGrouping(values.currentQuantity, values.pastQuantity).color\n },\n value: {\n isChangePerOne: getParameterForGrouping(values.currentValue, values.pastValue).isChange,\n colorPerOne: getParameterForGrouping(values.currentValue, values.pastValue).color,\n isChangePerAllQuantity: getParameterForGrouping(values.currentTotalValue, values.pastTotalValue).isChange,\n colorPerAllQuantity: getParameterForGrouping(values.currentTotalValue, values.pastTotalValue).color,\n },\n withMarkup: {\n isChangePerOne: getParameterForGrouping(values.currentWithMarkup, values.pastWithMarkup).isChange,\n colorPerOne: getParameterForGrouping(values.currentWithMarkup, values.pastWithMarkup).color,\n isChangePerAllQuantity: getParameterForGrouping(values.currentTotalWithMarkup, values.pastTotalWithMarkup).isChange,\n colorPerAllQuantity: getParameterForGrouping(values.currentTotalWithMarkup, values.pastTotalWithMarkup).color,\n },\n };\n }\n\n return parameters;\n } catch (e) {\n return {};\n }\n },\n // Доп функция для getStateOfChangeGrouping(node, priceType)\n getParameterForGrouping(current, past) {\n let parameter = { isChange: false, color: 'black' }; // default\n // console.log('=====================')\n // console.log('current: ', current)\n // console.log('past: ', past)\n if (current !== past) {\n parameter.isChange = true;\n parameter.color = 'orange'; // или логику по типу (green/red как в getParameterForItem)\n }\n\n return parameter\n },\n}\n\n"},"ports":[],"children":[]},{"id":"24b055f8-0de3-568c-3241-967ada2ec9fc","type":"JavaScriptFunction","parameters":{"functionScript":"/* // Подготавливаем данные для запроса к сервису\r\nconst { project, environment } = R.env\r\nconst endpointUploadFilesURL = 'https://uploadfiles.services.p3.rolder.app/uploadfiles_v1.0.0';\r\nconst endpointDeleteFilesURL = 'https://deletefiles.services.p3.rolder.app/deletefiles_v1.0.0';\r\nconst noderedCreds = R.params.creds?.find((i) => i.name === 'nodered')?.data\r\nconst creds = {\r\n username: noderedCreds.username,\r\n password: noderedCreds.password,\r\n};\r\n\r\n// Асинхронный запрос к сервисам Nodered\r\nasync function useNoderedService(url, credentials, formData) {\r\n try {\r\n // Заголовки запроса\r\n const headers = {\r\n Authorization: `Basic ${btoa(`${credentials.username}:${credentials.password}`)}`,\r\n };\r\n\r\n // Параметры запроса\r\n const options = {\r\n method: 'POST',\r\n headers,\r\n body: formData,\r\n };\r\n\r\n // Отправляем запрос\r\n const response = await fetch(url, options);\r\n\r\n // Проверяем статус ответа\r\n if (!response.ok) {\r\n throw new Error(`Ошибка HTTP: ${response.status}`);\r\n }\r\n\r\n // Извлекаем JSON из ответа\r\n const jsonResponse = await response.json();\r\n\r\n return jsonResponse;\r\n } catch (error) {\r\n console.error('Ошибка при выполнении запроса к Nodered:', error.message);\r\n throw error;\r\n }\r\n}\r\n\r\n// Формирование FormData для тела запроса к Nodered\r\nfunction getFormData(flowData, project, environment) {\r\n // Формируем объект FormData\r\n const formData = new FormData();\r\n if (flowData) {\r\n if (flowData.params) formData.append(\r\n 'params',\r\n JSON.stringify({\r\n // Так как запрос будет идти к сервисам, добавляем информацию о среде проекта\r\n project,\r\n environment,\r\n ...flowData.params,\r\n })\r\n )\r\n if (flowData.data) formData.append('data', JSON.stringify(flowData.data))\r\n if (flowData.files) flowData.files.map((i) => formData.append(encodeURIComponent(i.name), i))\r\n }\r\n\r\n return formData\r\n}\r\n\r\nconst imagesForDelete = ['Ссылка 1', 'Ссылка 2'] // Тут массив ссылок (строк)\r\n\r\nconst flowData = { params: { filesUrl: imagesForDelete }, data: {}, files: [] } // Флоу дата для удаления файлов\r\nconst formData = getFormData(flowData, project, environment)\r\n\r\n// Выполняем запрос\r\nawait useNoderedService(endpointDeleteFilesURL, creds, formData)\r\n .then(response => {\r\n return response\r\n })\r\n .catch(error => {\r\n console.error('Ошибка при удалении картинок: ', error);\r\n }); */"},"ports":[],"children":[]}],"connections":[{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"authMounted","targetId":"2a5977e4-295c-0bde-1087-1c17a269966d","targetPort":"Mounted"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"authOpacity","targetId":"2a5977e4-295c-0bde-1087-1c17a269966d","targetPort":"Opacity"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"architectOpacity","targetId":"03d0f1d8-72b6-0011-aba2-07baed6820b5","targetPort":"Opacity"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"architectMounted","targetId":"03d0f1d8-72b6-0011-aba2-07baed6820b5","targetPort":"Mounted"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"directoryManagerOpacity","targetId":"96fdcbed-4341-e3ff-87a7-183c5dd07aef","targetPort":"Opacity"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"adminOpacity","targetId":"fb1eb0db-0683-72a4-aa04-08f38589711a","targetPort":"Opacity"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"adminMounted","targetId":"fb1eb0db-0683-72a4-aa04-08f38589711a","targetPort":"Mounted"},{"sourceId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","sourcePort":"directoryManagerMounted","targetId":"96fdcbed-4341-e3ff-87a7-183c5dd07aef","targetPort":"Mounted"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"userRole","targetId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","targetPort":"currentState"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"signedOut","targetId":"c5baad41-bc49-ae2f-5c1d-c0d65c2be2ae","targetPort":"to-notAuthenticated"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"signingIn","targetId":"2a5977e4-295c-0bde-1087-1c17a269966d","targetPort":"signingIn"},{"sourceId":"2a5977e4-295c-0bde-1087-1c17a269966d","sourcePort":"username","targetId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","targetPort":"username"},{"sourceId":"2a5977e4-295c-0bde-1087-1c17a269966d","sourcePort":"password","targetId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","targetPort":"password"},{"sourceId":"2a5977e4-295c-0bde-1087-1c17a269966d","sourcePort":"signIn","targetId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","targetPort":"signIn"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"didMount","targetId":"a3048cf4-f77d-6be4-6a98-e7d168d1f282","targetPort":"run"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"didMount","targetId":"608d741b-a049-231d-f39f-388d6ffc01ca","targetPort":"run"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"didMount","targetId":"11c0ed9e-2dbf-f58f-b51b-0f742c007f98","targetPort":"run"},{"sourceId":"3b1fc3c7-9f74-6528-00cb-c633566ec754","sourcePort":"didMount","targetId":"a9932ca7-0b9e-4f30-0b95-9cdec7767b4e","targetPort":"run"}],"ports":[],"roots":["3b1fc3c7-9f74-6528-00cb-c633566ec754"],"metadata":{"canvasSize":{"width":"1039px","height":"751px"},"canvasPos":{"x":0,"y":0}}},{"name":"/App/SignIn","nodes":[{"id":"433c87c3-ed07-adbd-1de1-fde0457efc45","type":"Component Inputs","parameters":{},"ports":[],"children":[]},{"id":"b255558f-e9b5-a322-613a-8cc352f91304","type":"Component Outputs","parameters":{},"ports":[],"children":[]},{"id":"97ddad67-daa8-3460-b347-0d63a1de9661","type":"rolder-kit.Center","parameters":{"version":"v1.0.0","customProps":"[{sx: {height: '100%'}}]"},"ports":[],"children":[{"id":"d2ba51c1-4a18-d639-7a38-108c02db6a89","type":"rolder-kit.Stack","parameters":{"version":"v1.0.0","stackAlign":"center"},"ports":[],"children":[{"id":"b463d8bb-8d18-edc3-e2cd-68c6788d67c7","type":"rolder-kit.Avatar","parameters":{"version":"v1.0.0","size":"xl","color":"gray","avatarVariant":"filled","customProps":"[{radius: 64}]"},"ports":[],"children":[{"id":"f86c54d0-71ed-6488-d4ca-d1bc5792bf35","type":"rolder-kit.Icon","parameters":{"version":"v1.0.0","iconName":"IconUser","iconSize":{"value":5,"unit":"rem"},"stroke":0.5,"iconStroke":0.75},"ports":[],"children":[]}]},{"id":"53f696dc-f213-8176-c297-1043bd73716c","type":"rolder-kit.Text","parameters":{"version":"v1.0.0","dataSource":"value","valueSource":"Авторизация","fz":"xl","fw":"600"},"ports":[],"children":[]},{"id":"40e56bbe-4b95-8a4c-45e1-00f7a5d3057e","type":"rolder-kit.Paper","parameters":{"version":"v1.0.0","paddings":true,"p":"md"},"ports":[],"children":[{"id":"567a21c8-4ba5-9924-6cf0-b52d4a98cedf","type":"rolder-kit.Form","parameters":{"version":"v1.0.0","formScheme":"[{\n initialValues: {\n username: '',\n password: ''\n },\n validate: {\n username: R.libs.mantine.form.isNotEmpty(),\n password: R.libs.mantine.form.isNotEmpty()\n },\n}]"},"ports":[],"children":[{"id":"a028c9fa-94ff-b1d0-08c5-6525d8b2bad4","type":"rolder-kit.Stack","parameters":{"version":"v1.0.0","w":{"value":16,"unit":"rem"}},"ports":[],"children":[{"id":"ad1774ad-a0d1-9780-e9d1-e084d71af2b2","type":"rolder-kit.TextInput","parameters":{"version":"v1.0.0","label":"Логин","withAsterisk":true,"useForm":true,"formField":"username","useScope":true},"ports":[],"children":[]},{"id":"18beb872-277c-906a-4bba-f9459d12983e","type":"rolder-kit.PasswordInput","parameters":{"label":"Пароль","withAsterisk":true,"formField":"password","version":"v1.0.0","useScope":true},"ports":[],"children":[]},{"id":"5e6d349d-d908-41fd-99c2-f0845b8f9c4d","type":"rolder-kit.Group","parameters":{"version":"v1.0.0","groupPosition":"right","margins":true,"mt":"xs"},"ports":[],"children":[{"id":"5b93696f-534e-a2a9-0227-cb51a1ae4b66","type":"rolder-kit.Button","parameters":{"version":"v1.0.0","label":"Вход","color":"blue","buttonType":"submit"},"ports":[],"children":[]}]}]}]}]}]}]}],"connections":[{"sourceId":"433c87c3-ed07-adbd-1de1-fde0457efc45","sourcePort":"Mounted","targetId":"97ddad67-daa8-3460-b347-0d63a1de9661","targetPort":"mounted"},{"sourceId":"433c87c3-ed07-adbd-1de1-fde0457efc45","sourcePort":"Opacity","targetId":"97ddad67-daa8-3460-b347-0d63a1de9661","targetPort":"opacity"},{"sourceId":"18beb872-277c-906a-4bba-f9459d12983e","sourcePort":"typedValue","targetId":"b255558f-e9b5-a322-613a-8cc352f91304","targetPort":"password"},{"sourceId":"567a21c8-4ba5-9924-6cf0-b52d4a98cedf","sourcePort":"submited","targetId":"b255558f-e9b5-a322-613a-8cc352f91304","targetPort":"signIn"},{"sourceId":"ad1774ad-a0d1-9780-e9d1-e084d71af2b2","sourcePort":"typedValue","targetId":"b255558f-e9b5-a322-613a-8cc352f91304","targetPort":"username"},{"sourceId":"433c87c3-ed07-adbd-1de1-fde0457efc45","sourcePort":"signingIn","targetId":"5b93696f-534e-a2a9-0227-cb51a1ae4b66","targetPort":"loading"}],"ports":[{"name":"username","type":"string","plug":"output","index":0},{"name":"Opacity","type":"number","default":1,"group":"Style","plug":"input","index":0},{"name":"password","type":"string","plug":"output","index":1},{"name":"Mounted","type":"boolean","default":true,"group":"General","plug":"input","index":1},{"name":"signIn","type":"signal","plug":"output","index":2},{"name":"signingIn","type":"boolean","default":false,"group":"States","plug":"input","index":2}],"roots":["97ddad67-daa8-3460-b347-0d63a1de9661"]},{"name":"/App/admin","nodes":[{"id":"efcc6d66-6893-7df1-bdd3-6d5e6e2fbf28","type":"RouterNavigate","parameters":{"router":"admin","target":"/App/admin/cabinet"},"ports":[],"children":[]},{"id":"4506f1f7-b70a-aaa7-5565-60df1c86b3d7","type":"Component Inputs","parameters":{},"ports":[],"children":[]},{"id":"8a69d271-c7c5-4eff-0287-07330f7d848a","type":"rolder-kit.AppShell","parameters":{"version":"v1.0.0","navbar":true,"navbarWidth":"[{xs: '8rem'}]","navbarRespHide":true,"navbarHiddenBreakpoint":"xs","navbarOffsetBreakpoint":"xs","mounted":false},"ports":[],"children":[{"id":"c1eda8b1-56f5-6371-5c74-984dac8ede93","type":"rolder-kit.Navbar","parameters":{"version":"v1.0.0","navbarWidth":"[{xs: '2.5rem'}]","navbarHiddenBreakpoint":"xs","navbarOffsetBreakpoint":"xs","navbarRespHide":true,"navbarWithBorder":false,"paddings":true,"pt":"md","mounted":false},"ports":[],"children":[{"id":"423d7bec-e240-6271-d260-d8cce03bf8ba","type":"rolder-kit.NavbarSection","parameters":{"version":"v1.0.0","grow":true,"margins":true,"mt":"md"},"ports":[],"children":[{"id":"b7b1cd88-8262-16ae-3057-ef2a0626441c","type":"rolder-kit.NavLink","parameters":{"version":"v1.0.0","label":"admin","iconName":"IconUser","iconSize":{"value":1,"unit":"rem"},"color":"blue"},"ports":[],"children":[]}]}]},{"id":"992d6367-fcfd-983b-1154-a370d14d635e","type":"Router","parameters":{"name":"admin","pages":{"routes":["/App/Admin/Subscriptions","/App/Admin/Companies","/App/admin/cabinet","/App/admin/cabinet/users"],"startPage":"/App/admin/cabinet"},"urlPath":"admin","mounted":true},"ports":[],"children":[]}]},{"id":"ff4f6299-1eda-3aea-02b6-b10facd4e839","type":"JavaScriptFunction","parameters":{"functionScript":"const navigate = Inputs.navigate\r\n\r\nif (navigate === \"cabinet\") {\r\n Outputs.activeCabinet = true\r\n} else {\r\n Outputs.active = false\r\n}"},"ports":[{"name":"in-navigate","displayName":"navigate","plug":"input","type":"*","group":"Inputs","index":4},{"name":"out-activeCabinet","displayName":"activeCabinet","plug":"output","type":"*","group":"Outputs","index":5},{"name":"out-active","displayName":"active","plug":"output","type":"*","group":"Outputs","index":6}],"children":[]}],"connections":[{"sourceId":"992d6367-fcfd-983b-1154-a370d14d635e","sourcePort":"currentPageTitle","targetId":"b7b1cd88-8262-16ae-3057-ef2a0626441c","targetPort":"activateLabel"},{"sourceId":"b7b1cd88-8262-16ae-3057-ef2a0626441c","sourcePort":"clicked","targetId":"efcc6d66-6893-7df1-bdd3-6d5e6e2fbf28","targetPort":"navigate"},{"sourceId":"4506f1f7-b70a-aaa7-5565-60df1c86b3d7","sourcePort":"Mounted","targetId":"8a69d271-c7c5-4eff-0287-07330f7d848a","targetPort":"mounted"},{"sourceId":"4506f1f7-b70a-aaa7-5565-60df1c86b3d7","sourcePort":"Opacity","targetId":"8a69d271-c7c5-4eff-0287-07330f7d848a","targetPort":"opacity"},{"sourceId":"992d6367-fcfd-983b-1154-a370d14d635e","sourcePort":"currentPageTitle","targetId":"ff4f6299-1eda-3aea-02b6-b10facd4e839","targetPort":"in-navigate"},{"sourceId":"ff4f6299-1eda-3aea-02b6-b10facd4e839","sourcePort":"out-activeCabinet","targetId":"b7b1cd88-8262-16ae-3057-ef2a0626441c","targetPort":"active"}],"ports":[{"name":"Opacity","type":"number","default":1,"group":"Style","plug":"input","index":0},{"name":"Mounted","type":"boolean","default":false,"group":"General","plug":"input","index":1}],"roots":["8a69d271-c7c5-4eff-0287-07330f7d848a"]},{"name":"/App/directory-Manager","nodes":[{"id":"39337971-a7e6-e159-7f5e-e3692de52375","type":"Component Inputs","parameters":{},"ports":[],"children":[]},{"id":"fe11dfcd-9f16-2225-3093-b8324b0a0359","type":"rolder-kit.AppShell","parameters":{"version":"v1.0.0","navbar":true,"navbarWidth":"[{xs: '8rem'}]","navbarRespHide":true,"navbarHiddenBreakpoint":"xs","navbarOffsetBreakpoint":"xs","mounted":false},"ports":[],"children":[{"id":"c3db6289-7d47-ab2d-5af9-3001bbe780e6","type":"rolder-kit.Navbar","parameters":{"version":"v1.0.0","navbarWidth":"[{xs: '2.5rem'}]\r\n// [{xs: '2.5rem'}]","navbarHiddenBreakpoint":"xs","navbarOffsetBreakpoint":"xs","navbarRespHide":true,"navbarWithBorder":false,"paddings":true,"pt":"md"},"ports":[],"children":[{"id":"538325f2-ba15-6e88-6512-12e4d6da9117","type":"rolder-kit.NavbarSection","parameters":{"version":"v1.0.0","grow":true},"ports":[],"children":[{"id":"3279023c-ff8c-79e6-4315-7a8725a60f8f","type":"rolder-kit.NavLink","parameters":{"version":"v1.0.0","iconName":"IconBriefcase2","iconSize":{"value":1.2,"unit":"rem"},"color":"blue","label":"designing","active":false,"mounted":true},"ports":[],"children":[]},{"id":"d4af940b-b0bb-5c85-5c7a-b05b5cbd4962","type":"rolder-kit.NavLink","parameters":{"version":"v1.0.0","iconName":"IconHammer","iconSize":{"value":1.2,"unit":"rem"},"color":"blue","label":"execution","active":false,"mounted":true},"ports":[],"children":[]},{"id":"3e80353c-7631-5854-da97-c8344cdf6e4d","type":"rolder-kit.NavLink","parameters":{"version":"v1.0.0","iconName":"IconFolder","iconSize":{"value":1.2,"unit":"rem"},"color":"blue","label":"directory","active":false,"mounted":true},"ports":[],"children":[]}]}]},{"id":"1f4936f7-5071-fc0d-8cf8-f820c20d0c8b","type":"Router","parameters":{"pages":{"routes":["/App/CompanyManager/WorkPlanner","/App/CompanyManager/Houses","/App/CompanyManager/Directory","/App/CompanyManager/Reports","/App/directory-Manager/directory","/App/directory-Manager/designing","/App/directory-Manager/execution"],"startPage":"/App/directory-Manager/designing"},"name":"directory-Manager","urlPath":"directory-Manager","styleCss":"/* background-color: red; */\r\nheight: 100%;","clip":"contentHeight","mounted":true},"ports":[],"children":[]}]},{"id":"f4618d6c-fa93-9d7f-143f-44fcb4f3a912","type":"RouterNavigate","parameters":{"router":"directory-Manager","target":"/App/directory-Manager/directory"},"ports":[],"children":[]},{"id":"1539551c-d635-62df-8b3a-e48863c415dd","type":"RouterNavigate","parameters":{"router":"directory-Manager","target":"/App/directory-Manager/designing"},"ports":[],"children":[]},{"id":"eaad139a-a22d-c423-17ec-ba14301bc006","type":"Event Sender","parameters":{"channelName":"clickTab"},"ports":[],"children":[]},{"id":"ab309877-e994-ed96-92b8-f0c1368437cd","type":"Event Sender","parameters":{"channelName":"doneSpecification"},"ports":[],"children":[]},{"id":"43ef66df-b64a-61db-f4b4-0bb613f464d4","type":"RouterNavigate","parameters":{"router":"directory-Manager","target":"/App/directory-Manager/execution"},"ports":[],"children":[]},{"id":"f83db282-dce4-245a-8a26-d1dbc9d16840","type":"JavaScriptFunction","parameters":{"functionScript":"// const mounted = Inputs.mounted\r\n\r\nif (R.env.environment === 'd2') {\r\n Outputs.mounted = true\r\n} else if (R.env.environment === 't2') {\r\n Outputs.mounted = true\r\n} else if (R.env.environment === 's2') {\r\n Outputs.mounted = true\r\n} else if (R.env.environment === 'p2') {\r\n Outputs.mounted = true\r\n}\r\n\r\n\r\n"},"ports":[{"name":"in-mounted","displayName":"mounted","plug":"input","type":"*","group":"Inputs","index":4},{"name":"out-mounted","displayName":"mounted","plug":"output","type":"*","group":"Outputs","index":5}],"children":[]}],"connections":[{"sourceId":"39337971-a7e6-e159-7f5e-e3692de52375","sourcePort":"Mounted","targetId":"fe11dfcd-9f16-2225-3093-b8324b0a0359","targetPort":"mounted"},{"sourceId":"39337971-a7e6-e159-7f5e-e3692de52375","sourcePort":"Opacity","targetId":"fe11dfcd-9f16-2225-3093-b8324b0a0359","targetPort":"opacity"},{"sourceId":"1f4936f7-5071-fc0d-8cf8-f820c20d0c8b","sourcePort":"currentPageTitle","targetId":"3e80353c-7631-5854-da97-c8344cdf6e4d","targetPort":"activateLabel"},{"sourceId":"3e80353c-7631-5854-da97-c8344cdf6e4d","sourcePort":"clicked","targetId":"f4618d6c-fa93-9d7f-143f-44fcb4f3a912","targetPort":"navigate"},{"sourceId":"3279023c-ff8c-79e6-4315-7a8725a60f8f","sourcePort":"clicked","targetId":"1539551c-d635-62df-8b3a-e48863c415dd","targetPort":"navigate"},{"sourceId":"1f4936f7-5071-fc0d-8cf8-f820c20d0c8b","sourcePort":"currentPageTitle","targetId":"3279023c-ff8c-79e6-4315-7a8725a60f8f","targetPort":"activateLabel"},{"sourceId":"3279023c-ff8c-79e6-4315-7a8725a60f8f","sourcePort":"clicked","targetId":"eaad139a-a22d-c423-17ec-ba14301bc006","targetPort":"sendEvent"},{"sourceId":"3e80353c-7631-5854-da97-c8344cdf6e4d","sourcePort":"clicked","targetId":"eaad139a-a22d-c423-17ec-ba14301bc006","targetPort":"sendEvent"},{"sourceId":"3279023c-ff8c-79e6-4315-7a8725a60f8f","sourcePort":"clicked","targetId":"ab309877-e994-ed96-92b8-f0c1368437cd","targetPort":"sendEvent"},{"sourceId":"3e80353c-7631-5854-da97-c8344cdf6e4d","sourcePort":"clicked","targetId":"ab309877-e994-ed96-92b8-f0c1368437cd","targetPort":"sendEvent"},{"sourceId":"1f4936f7-5071-fc0d-8cf8-f820c20d0c8b","sourcePort":"currentPageTitle","targetId":"d4af940b-b0bb-5c85-5c7a-b05b5cbd4962","targetPort":"activateLabel"},{"sourceId":"d4af940b-b0bb-5c85-5c7a-b05b5cbd4962","sourcePort":"clicked","targetId":"eaad139a-a22d-c423-17ec-ba14301bc006","targetPort":"sendEvent"},{"sourceId":"d4af940b-b0bb-5c85-5c7a-b05b5cbd4962","sourcePort":"clicked","targetId":"ab309877-e994-ed96-92b8-f0c1368437cd","targetPort":"sendEvent"},{"sourceId":"d4af940b-b0bb-5c85-5c7a-b05b5cbd4962","sourcePort":"clicked","targetId":"43ef66df-b64a-61db-f4b4-0bb613f464d4","targetPort":"navigate"},{"sourceId":"f83db282-dce4-245a-8a26-d1dbc9d16840","sourcePort":"out-mounted","targetId":"d4af940b-b0bb-5c85-5c7a-b05b5cbd4962","targetPort":"mounted"},{"sourceId":"c3db6289-7d47-ab2d-5af9-3001bbe780e6","sourcePort":"didMount","targetId":"f83db282-dce4-245a-8a26-d1dbc9d16840","targetPort":"run"}],"ports":[{"name":"Opacity","type":"number","default":1,"group":"Style","plug":"input","index":0},{"name":"Mounted","type":"boolean","default":false,"group":"General","plug":"input","index":1}],"roots":["fe11dfcd-9f16-2225-3093-b8324b0a0359"]},{"name":"/App/architect","nodes":[{"id":"4b82e22e-bfdb-73bc-525b-81cb7320dda1","type":"Component Inputs","parameters":{},"ports":[],"children":[]},{"id":"25b73b41-6763-64fb-f796-80e0f8a52467","type":"rolder-kit.AppShell","parameters":{"version":"v1.0.0","navbar":true,"navbarWidth":"[{xs: '8rem'}]","navbarRespHide":true,"navbarHiddenBreakpoint":"xs","navbarOffsetBreakpoint":"xs","mounted":false},"ports":[],"children":[{"id":"e1629385-eba8-98bb-05fd-6875a3174d78","type":"rolder-kit.Navbar","parameters":{"version":"v1.0.0","navbarWidth":"[{xs: '2.5rem'}]\r\n// [{xs: '2.5rem'}]","navbarHiddenBreakpoint":"xs","navbarOffsetBreakpoint":"xs","navbarRespHide":true,"navbarWithBorder":false,"paddings":true,"pt":"md"},"ports":[],"children":[{"id":"6fba840e-ef68-9452-bfeb-5a44876711e4","type":"rolder-kit.NavbarSection","parameters":{"version":"v1.0.0","grow":true},"ports":[],"children":[{"id":"ae6f4498-6147-4a30-7b8f-c035434748c1","type":"rolder-kit.NavLink","parameters":{"version":"v1.0.0","iconName":"IconBriefcase2","iconSize":{"value":1.2,"unit":"rem"},"color":"blue","label":"designing","active":false,"mounted":true},"ports":[],"children":[]}]}]},{"id":"ff9f2d1a-b860-2828-6d83-e03bbf7cc9a1","type":"Router","parameters":{"pages":{"routes":["/App/CompanyManager/WorkPlanner","/App/CompanyManager/Houses","/App/CompanyManager/Directory","/App/CompanyManager/Reports","/App/directory-Manager/designing","/App/directory-Manager/execution"],"startPage":"/App/directory-Manager/designing"},"name":"architect","urlPath":"architect","styleCss":"/* background-color: red; */\r\n","clip":"contentHeight","mounted":true},"ports":[],"children":[]}]},{"id":"08ed7155-0951-1ce4-1f27-c9b85297538b","type":"RouterNavigate","parameters":{"router":"architect","target":"/App/directory-Manager/designing"},"ports":[],"children":[]},{"id":"545818e1-ac7b-8c3c-0b9e-54ef2578ec08","type":"Event Sender","parameters":{"channelName":"clickTab"},"ports":[],"children":[]}],"connections":[{"sourceId":"4b82e22e-bfdb-73bc-525b-81cb7320dda1","sourcePort":"Mounted","targetId":"25b73b41-6763-64fb-f796-80e0f8a52467","targetPort":"mounted"},{"sourceId":"4b82e22e-bfdb-73bc-525b-81cb7320dda1","sourcePort":"Opacity","targetId":"25b73b41-6763-64fb-f796-80e0f8a52467","targetPort":"opacity"},{"sourceId":"ae6f4498-6147-4a30-7b8f-c035434748c1","sourcePort":"clicked","targetId":"08ed7155-0951-1ce4-1f27-c9b85297538b","targetPort":"navigate"},{"sourceId":"ff9f2d1a-b860-2828-6d83-e03bbf7cc9a1","sourcePort":"currentPageTitle","targetId":"ae6f4498-6147-4a30-7b8f-c035434748c1","targetPort":"activateLabel"},{"sourceId":"ae6f4498-6147-4a30-7b8f-c035434748c1","sourcePort":"clicked","targetId":"545818e1-ac7b-8c3c-0b9e-54ef2578ec08","targetPort":"sendEvent"}],"ports":[{"name":"Opacity","type":"number","default":1,"group":"Style","plug":"input","index":0},{"name":"Mounted","type":"boolean","default":false,"group":"General","plug":"input","index":1}],"roots":["25b73b41-6763-64fb-f796-80e0f8a52467"]}],"componentIndex":{"b1-eabd31e93f6b3431":{"components":["/App/admin/cabinet"],"dependencies":["b2-e1b0064ebfb0e58b"]},"b2-e1b0064ebfb0e58b":{"components":["/App/directory-Manager/designing/Header components/Header actions"],"dependencies":[]},"b3-53651d702b81dc64":{"components":["/App/admin/cabinet/users","/App/admin/cabinet/users/Toggle Switch","/App/admin/cabinet/users/UseData"],"dependencies":["b4-11dc35b052fb08a9","b5-5d72410ab3cf159a"]},"b4-11dc35b052fb08a9":{"components":["/App/Reusable/generalNotificator"],"dependencies":[]},"b5-5d72410ab3cf159a":{"components":["/App/Shared/Logical/loadingToggle"],"dependencies":[]},"b6-118a225e8507a918":{"components":["/App/directory-Manager/designing","/App/directory-Manager/designing/Header components/All projects","/App/directory-Manager/designing/Header components/All suplier order","/App/directory-Manager/designing/Header components/All work orders","/App/directory-Manager/designing/Header components/All customer order","/App/directory-Manager/designing/Header components/All calculation","/App/directory-Manager/designing/Header components/inside the project, renovation","/App/Shared/Visual/Dropdowns/NavigateDropdownListTable","/App/directory-Manager/designing/Header components/inside the project, renovation/ Dropdown navigation, type renovation #calculation","/App/directory-Manager/designing/Header components/inside the project,design","/App/directory-Manager/designing/Header components/inside the project,design/Dropdown navigation,type design #calculation","/App/directory-Manager/designing/Header components/What type of project"],"dependencies":["b7-55d0bf9ee505ae8c","b2-e1b0064ebfb0e58b"]},"b7-55d0bf9ee505ae8c":{"components":["/App/Shared/Visual/Logo"],"dependencies":[]},"b8-a6413b22bc996690":{"components":["/App/directory-Manager/execution"],"dependencies":["b7-55d0bf9ee505ae8c","b2-e1b0064ebfb0e58b"]},"b9-f05b31183c939426":{"components":["/App/directory-Manager/directory"],"dependencies":["b7-55d0bf9ee505ae8c","b2-e1b0064ebfb0e58b"]},"b10-4b11302aab01ac5b":{"components":["/App/directory-Manager/designing/projects","/App/directory-Manager/designing/projects/DataManagement/SelectCreateObjectOrProject","/App/directory-Manager/designing/projects/DataManagement/Object/CreateObject","/App/directory-Manager/designing/projects/DataManagement/Project/CreateProject","/App/directory-Manager/designing/projects/DataManagement/Object/ViewObject","/App/directory-Manager/designing/projects/DataManagement/Object/EditObject","/App/directory-Manager/designing/projects/DataManagement/Object/ArchiveTheObject","/App/directory-Manager/designing/projects/DataManagement/Project/ViewProject","/App/directory-Manager/designing/projects/DataManagement/Project/EditProject","/App/directory-Manager/designing/projects/DataManagement/Project/ArchiveTheProject","/App/directory-Manager/designing/projects/StatsPanel","/App/directory-Manager/designing/projects/ActionPanel","/App/directory-Manager/designing/projects/Table","/App/directory-Manager/designing/projects/data"],"dependencies":["b11-5925e52ab8e5c9af","b13-e038f0ff779a3219"]},"b11-5925e52ab8e5c9af":{"components":["/App/Shared/Visual/Dropdowns/ChangeFlowState"],"dependencies":["b12-8d6b10cda023024e"]},"b12-8d6b10cda023024e":{"components":["/App/Shared/Visual/Dropdowns/ChangeFlowState/Cell 0","/App/Shared/Visual/Dropdowns/ChangeFlowState/Cell 1"],"dependencies":[]},"b13-e038f0ff779a3219":{"components":["/App/Shared/Logical/naturalSort"],"dependencies":[]},"b14-84a70b6686cdda76":{"components":["/App/directory-Manager/designing/specification","/App/directory-Manager/designing/specification/Page information header #specification","/App/directory-Manager/designing/specification/Data management menu #specification","/App/directory-Manager/designing/specification/Data management menu #specification/Сhange the status of sections","/App/directory-Manager/designing/specification/Data management menu #specification/Dropdown list for managing #specification","/App/directory-Manager/designing/specification/Data management menu #specification/Dropdown add material","/App/directory-Manager/designing/specification/Import material #specification","/App/Shared/Visual/TableObjectsForImport","/App/Shared/Visual/TableObjectsForImport/SubTableProjects","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Drawer import #specification","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Drawer import #specification/Repeater import #specification","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Function to import hierarchy #specification","/App/Shared/Visual/TableObjectsForImport/Selected item #designing #projects","/App/directory-Manager/designing/specification/Table Level 1","/App/directory-Manager/designing/specification/Table Level 1/Selected Item","/App/directory-Manager/designing/specification/Table Level 1/Level 2","/App/directory-Manager/designing/specification/Table Level 1/Level 2/Level 3","/App/directory-Manager/designing/specification/Table Level 1/Level 2/Level 3/Level 4","/App/directory-Manager/designing/specification/Table Level 1/Level 2/Level 3/Level 4/Level 5","/App/Shared/visual components/Cell 0 Image and Name. for materials","/App/directory-Manager/designing/specification/Table Level 1/Cell section/Cell 10 pmg","/App/directory-Manager/designing/Resets designing/specification/Reset Table #specification","/App/directory-Manager/designing/specification/Current project item","/App/directory-Manager/designing/specification/Adding materials from the directory","/App/directory-Manager/designing/specification/Adding materials from the directory/Table hierarchy L1 #material-group #specification","/App/directory-Manager/designing/specification/Adding materials from the directory/ Information header for the directory","/App/directory-Manager/designing/specification/Adding materials from the directory/Table for adding materials from the directory #specification","/App/directory-Manager/designing/specification/Adding materials from the directory/Table for adding materials from the directory #specification/Cell 0 hover button for directory","/App/directory-Manager/designing/specification/Adding materials from the directory/Boofer","/App/directory-Manager/designing/specification/Adding materials from the directory/Boofer/Moving materials for directory #specification","/App/directory-Manager/designing/specification/Adding materials from the directory/Boofer/Moving materials for directory #specification/Repeater moving materials for directory","/App/directory-Manager/designing/specification/UseData #specification","/App/directory-Manager/designing/Resets designing/specification/Reset UseData #project-material-group","/App/directory-Manager/designing/specification/Сreation and editing project-material-group #specification","/App/directory-Manager/designing/specification/Сreation and editing project-material-group #specification/Create project-material-group","/App/directory-Manager/designing/specification/Сreation and editing project-material-group #specification/Update project-material-group","/App/directory-Manager/designing/specification/Сreation and editing project-material #specification","/App/directory-Manager/designing/specification/Сreation and editing project-material #specification/Create project-material","/App/directory-Manager/designing/specification/Сreation and editing project-material #specification/Create project-material/Upload image create #specification #experimental","/App/directory-Manager/designing/specification/Сreation and editing project-material #specification/Update project-material","/App/directory-Manager/designing/specification/Сreation and editing project-material #specification/Update project-material/Upload image update #specification #experimental","/App/directory-Manager/designing/specification/Moving materials","/App/directory-Manager/designing/specification/Moving materials/Repeater moving materials","/App/directory-Manager/designing/specification/Mass removal of materials","/App/directory-Manager/designing/specification/Information drawer for section #specification","/App/directory-Manager/designing/specification/Information drawer for section #specification/Delete project-material-group #specification","/App/directory-Manager/designing/specification/Information drawer for material #specification","/App/directory-Manager/designing/specification/Information drawer for material #specification/Delete project-material","/App/directory-Manager/designing/specification/Send to the equip","/App/Shared/Visual/Materials essence management/Essence management","/App/Shared/Visual/Materials essence management/Essence management/Create essence","/App/Shared/Visual/Materials essence management/Essence management/Add materials to essence","/App/Shared/Visual/Materials essence management/Essence management/Remove materials from essence","/App/directory-Manager/designing/specification/specForms managment","/App/directory-Manager/designing/specification/specForms managment/Create specForms","/App/directory-Manager/designing/specification/specForms managment/Add materials to specForms","/App/directory-Manager/designing/specification/specForms managment/Remove materials from the specifcation"],"dependencies":["b15-0159219143495046","b16-dfdabd11356dc185","b18-179e944379d4d7a9","b19-6a2634e394ec5178"]},"b15-0159219143495046":{"components":["/App/directory-Manager/directory/materials/Filter by brand ","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /Table material-group Level 2","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /Table material-group Level 2/Table material-group Level 3","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /Table material-group Level 2/Table material-group Level 3/Table material-group Level 4","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /Table material-group Level 2/Table material-group Level 3/Table material-group Level 4/Table material-group Level 5","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /Table material-group Level 2/Table material-group Level 3/Table material-group Level 4/Table material-group Level 5/Table material-group Level 6","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /Reset single selection #materials","/App/directory-Manager/directory/materials/Data management menu #material","/App/directory-Manager/directory/materials/Data management menu #material/ImportMaterials/DropdownImportMaterialsFromExcelFile","/App/directory-Manager/directory/materials/Data management menu #material/ImportMaterials/DropdownImportMaterialsFromExcelFile/DropDownItem","/App/directory-Manager/directory/materials/Data management menu #material/ImportMaterials/ImportMaterialsFromExcelFile","/App/directory-Manager/directory/materials/Data management menu #material/ImportMaterials/ImportMaterialsFromExcelFile/MissingLines","/App/directory-Manager/directory/materials/Data management menu #material/ImportMaterials/DownloadCurrentExcelTemplate","/App/directory-Manager/directory/Resets directory/material/Reset Table #material","/App/directory-Manager/directory/materials/Information drawer for material","/App/directory-Manager/directory/materials/Information drawer for material/Delete #material"],"dependencies":["b16-dfdabd11356dc185","b17-db50debabba39d9d","b4-11dc35b052fb08a9"]},"b16-dfdabd11356dc185":{"components":["/App/directory-Manager/directory/Resets directory/work/Reset Table hierarchy #work-group"],"dependencies":[]},"b17-db50debabba39d9d":{"components":["/App/Reusable/generalNodeRed"],"dependencies":[]},"b18-179e944379d4d7a9":{"components":["/App/Shared/Logic components/getAllParentSections"],"dependencies":[]},"b19-6a2634e394ec5178":{"components":["/App/Shared/Logic components/createNestingDepthInSections"],"dependencies":[]},"b20-846108c85cdf3410":{"components":["/App/directory-Manager/designing/estimate","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWork/CreateWork","/App/Shared/Visual/SmartPriceEntryBoxForWorks","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWork/EditWork","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWork/ViewWork","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWork/DeleteWork","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWork/DeleteWork/getCalcAndWorkOrdersForOneDelete","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectGroup/CreateProjectGroup","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectGroup/EditProjectGroup","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectGroup/DeleteProjectGroup","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWorkGroup/CreateSection","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWorkGroup/CreateSectionFromDirectory","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWorkGroup/EditSection#Common","/App/directory-Manager/designing/estimate/Shared/getHierarchyDocumentsForMore","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWorkGroup/DeleteSection#Common","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectMaterial/CreateMaterial","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectMaterial/ViewMaterial","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectMaterial/EditMaterial","/App/directory-Manager/designing/estimate/Shared/getDataForReorganizationAndChangesDocumentsWithMaterials","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectMaterial/DeleteMaterial","/App/directory-Manager/designing/estimate/HeadWithStats","/App/directory-Manager/designing/estimate/ImportPanel","/App/directory-Manager/designing/estimate/ImportPanel/ImportWorks","/App/directory-Manager/designing/estimate/ImportPanel/ImportWorks/RepeaterWorks","/App/directory-Manager/designing/estimate/ImportPanel/ImportWorks/getSections","/App/directory-Manager/designing/estimate/ImportPanel/ImportMaterials","/App/directory-Manager/designing/estimate/ImportPanel/ImportMaterials/RepeaterMaterials","/App/directory-Manager/designing/estimate/ImportPanel/ImportMaterials/getWorks","/App/directory-Manager/designing/estimate/ActionPanel","/App/directory-Manager/designing/estimate/ActionPanel/NewCalculationManagement/CreateCalculation","/App/directory-Manager/designing/estimate/ActionPanel/NewCalculationManagement/AddingWorksCalculation","/App/directory-Manager/designing/estimate/ActionPanel/NewCalculationManagement/DeleteWorksFromCalculation","/App/directory-Manager/designing/estimate/ActionPanel/MoveWorks","/App/directory-Manager/designing/estimate/ActionPanel/MassRemovalWorks","/App/directory-Manager/designing/estimate/ActionPanel/MassRemovalWorks/getCalcAndWorkOrdersForMassDelete","/App/directory-Manager/designing/estimate/ActionPanel/MassEditWorks","/App/directory-Manager/designing/estimate/ActionPanel/ModalForImport","/App/directory-Manager/designing/estimate/Table","/App/directory-Manager/designing/estimate/Distribution/Head","/App/directory-Manager/designing/estimate/Distribution/ActionPanel","/App/directory-Manager/designing/estimate/Distribution/ActionPanel/DistributionMaterials","/App/directory-Manager/designing/estimate/Distribution/ActionPanel/DistributionMaterials/MaterialsList","/App/directory-Manager/designing/estimate/Distribution/TableEquip","/App/directory-Manager/designing/estimate/Distribution/TableEstimate","/App/directory-Manager/designing/estimate/surrealData"],"dependencies":["b5-5d72410ab3cf159a","b21-a63e79eed4b7cc2a","b22-01802f15dd562f73","b4-11dc35b052fb08a9","b23-790cd345b1d81c73","b13-e038f0ff779a3219","b25-8a3daab6fe5393da","b11-5925e52ab8e5c9af","b26-a807d87e15b2922d","b18-179e944379d4d7a9"]},"b21-a63e79eed4b7cc2a":{"components":["/App/directory-Manager/designing/estimate/Shared/getHierarchyDocumentsForOne"],"dependencies":["b5-5d72410ab3cf159a"]},"b22-01802f15dd562f73":{"components":["/App/Shared/Visual/TextWithLabel","/App/Shared/Visual/ViewForm","/App/Shared/Visual/ViewForm/Field","/App/Shared/Visual/TableWithSectionsFromTheDirectory","/App/directory-Manager/designing/estimate/Shared/getMaterialSections","/App/Shared/Visual/ViewImage","/App/Shared/Visual/ViewImage/DeleteImage","/App/Shared/Logical/duplicateImages","/App/Shared/Visual/Dropdowns/ActionDropdownListTable","/App/Shared/Visual/Import/Table","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Head","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/ActionPanel","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Table/TableWorks","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Table/Cell 6","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Table/TableMaterials","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Boofer","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Boofer/ViewAddWorks","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Boofer/ViewAddWorks/Repeater","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Boofer/ViewAddMaterials","/App/directory-Manager/designing/Shared/AddingItemsFromTheDirectory/Boofer/ViewAddMaterials/Repeater"],"dependencies":["b13-e038f0ff779a3219","b24-3586ac88f271e4b0","b5-5d72410ab3cf159a","b4-11dc35b052fb08a9"]},"b23-790cd345b1d81c73":{"components":["/App/Shared/Visual/ImageUpload/ImageView","/App/Shared/Visual/SmartPriceEntryBoxForMaterials","/App/Shared/Visual/ImageUpload/imageUpload"],"dependencies":["b24-3586ac88f271e4b0"]},"b24-3586ac88f271e4b0":{"components":["/App/Reusable/generalServices"],"dependencies":[]},"b25-8a3daab6fe5393da":{"components":["/App/Shared/Logical/hierarchySort"],"dependencies":[]},"b26-a807d87e15b2922d":{"components":["/App/Shared/Visual/Dropdowns/ActionDropdownListRepeater","/App/Shared/Visual/Dropdowns/ActionDropdownListRepeater/DropDownItem"],"dependencies":[]},"b27-c97fe2cbf9e9ca55":{"components":["/App/directory-Manager/execution/schedule","/App/directory-Manager/execution/schedule/Page information header #execution #schedule","/App/directory-Manager/execution/schedule/Data managment menu #execution #schedule","/App/directory-Manager/execution/schedule/Modal Set Dates","/App/directory-Manager/execution/schedule/Modal Set Dates/dateTest","/App/directory-Manager/execution/schedule/Modal Set Dates/dateTest2","/App/directory-Manager/execution/schedule/Modal Set Dates/daysCountTest"],"dependencies":["b13-e038f0ff779a3219","b25-8a3daab6fe5393da"]},"b28-1fc576a0a3698f23":{"components":["/App/directory-Manager/designing/calculation","/App/directory-Manager/designing/calculation/DataManagment/Calculation/SetCommentCalculation","/App/directory-Manager/designing/calculation/ActionPanel","/App/directory-Manager/designing/calculation/ActionPanel/DeleteCalculations","/App/directory-Manager/designing/calculation/Table","/App/directory-Manager/designing/calculation/data","/App/directory-Manager/designing/calculation/Old","/App/directory-Manager/designing/calculation/Old/Page information header #calculation","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Сhange the status of calculation","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Download && preview pdf","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Achived calculation","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Delete calculation","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Remove changes","/App/directory-Manager/designing/calculation/Old/Table lvl 1 #calculation","/App/Shared/Visual/Cells/Cells with history/OldRK/AnyGrouping/Cell makup","/App/directory-Manager/designing/calculation/Old/Table lvl 1 #calculation/Table lvl 2 #calculation","/App/directory-Manager/designing/calculation/Old/Table lvl 1 #calculation/Table lvl 2 #calculation/Table lvl 3 #calculation","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell quantity","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell value per one","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell markup","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell withMarkup per one","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Create && edit comment","/App/directory-Manager/designing/calculation/Old/UseData #calculation"],"dependencies":["b29-89dca6c4aaa7eaae","b11-5925e52ab8e5c9af","b30-f734f9c5d9906602","b5-5d72410ab3cf159a","b4-11dc35b052fb08a9","b13-e038f0ff779a3219","b31-f978c978d5464191","b32-8e7a57fbaf264c6e","b19-6a2634e394ec5178"]},"b29-89dca6c4aaa7eaae":{"components":["/App/Shared/Visual/PageContent/HeadForPageWithMaterials"],"dependencies":[]},"b30-f734f9c5d9906602":{"components":["/App/directory-Manager/designing/Все калькуляции/ActionPanel/PdfDocumentGeneration","/App/directory-Manager/designing/Все калькуляции/ActionPanel/ArchivedDocuments","/App/directory-Manager/designing/calculation/ActionPanel/ResetChanges"],"dependencies":["b5-5d72410ab3cf159a","b4-11dc35b052fb08a9"]},"b31-f978c978d5464191":{"components":["/App/directory-Manager/execution/Resets execution/estimate/Reset Table #estimate"],"dependencies":[]},"b32-8e7a57fbaf264c6e":{"components":["/App/Shared/Visual/Cells/Cells with history/OldRK/AnyGrouping/Cell value","/App/Shared/Visual/Cells/Cells with history/OldRK/AnyGrouping/Cell withMarkup","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell value per all quantity","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell withMarkup per all quantity"],"dependencies":[]},"b33-81c711ff8752bbae":{"components":["/App/directory-Manager/designing/specForms","/App/directory-Manager/designing/specForms/ActionPanel","/App/directory-Manager/designing/specForms/ActionPanel/PdfDocumentGeneration","/App/directory-Manager/designing/specForms/ActionPanel/PdfDocumentGeneration/Header","/App/directory-Manager/designing/specForms/ActionPanel/ArchiveDocuments","/App/directory-Manager/designing/specForms/ActionPanel/DeleteDocuments","/App/directory-Manager/designing/specForms/ActionPanel/ResetChanges","/App/directory-Manager/designing/specForms/Table","/App/directory-Manager/designing/specForms/data"],"dependencies":["b29-89dca6c4aaa7eaae","b11-5925e52ab8e5c9af","b34-a13371062cdad6a3","b5-5d72410ab3cf159a","b13-e038f0ff779a3219"]},"b34-a13371062cdad6a3":{"components":["/App/directory-Manager/designing/Shared/PdfDocumentsWithMaterials/ChangedsWithMarkup"],"dependencies":[]},"b35-7599e6ae283e04ac":{"components":["/App/directory-Manager/designing/order-customer","/App/directory-Manager/designing/order-customer/ActionPanel","/App/directory-Manager/designing/order-customer/ActionPanel/DeleteDocuments","/App/directory-Manager/designing/order-customer/ActionPanel/ResetChanges","/App/directory-Manager/designing/order-customer/Table","/App/directory-Manager/designing/order-customer/data"],"dependencies":["b29-89dca6c4aaa7eaae","b36-c501f5dd41c07ef8","b5-5d72410ab3cf159a","b13-e038f0ff779a3219"]},"b36-c501f5dd41c07ef8":{"components":["/App/directory-Manager/designing/order-customer/ActionPanel/ChangeFlowState#custom","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#customer-order-form","/App/directory-Manager/designing/Shared/PdfDocumentsWithMaterials/TableWithDetails (таблица с реквизитами)","/App/directory-Manager/designing/Shared/PdfDocumentsWithMaterials/Information","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#customer-order-form/FooterContractText","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#customer-order-form/FooterWithSignatures","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#customer-order-form/information","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#treaty-pay-order-form","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#treaty-pay-order-form/FooterContractText","/App/directory-Manager/designing/order-customer/ActionPanel/PdfDocumentGeneration#treaty-pay-order-form/FooterWithSignatures","/App/directory-Manager/designing/order-customer/ActionPanel/ArchiveDocuments"],"dependencies":["b12-8d6b10cda023024e","b34-a13371062cdad6a3","b5-5d72410ab3cf159a"]},"b37-ce00ff6714042601":{"components":["/App/directory-Manager/designing/order-suplier","/App/directory-Manager/designing/order-suplier/ActionPanel","/App/directory-Manager/designing/order-suplier/ActionPanel/DeleteDocuments","/App/directory-Manager/designing/order-suplier/ActionPanel/ResetChanges","/App/directory-Manager/designing/order-suplier/Table","/App/directory-Manager/designing/order-suplier/data"],"dependencies":["b29-89dca6c4aaa7eaae","b11-5925e52ab8e5c9af","b38-c5da15d0290fc208","b5-5d72410ab3cf159a","b13-e038f0ff779a3219"]},"b38-c5da15d0290fc208":{"components":["/App/directory-Manager/designing/order-suplier/ActionPanel/PdfDocumentGeneration","/App/directory-Manager/designing/order-suplier/ActionPanel/PdfDocumentGeneration/Information","/App/directory-Manager/designing/order-suplier/ActionPanel/PdfDocumentGeneration/ChangedsValue","/App/directory-Manager/designing/order-suplier/ActionPanel/ArchiveDocuments"],"dependencies":["b5-5d72410ab3cf159a"]},"b39-fa347c9c640ff0fe":{"components":["/App/directory-Manager/designing/combine","/App/directory-Manager/designing/combine/DataManagement/Common/Material/CreateMaterial#Common","/App/directory-Manager/designing/combine/DataManagement/SpecificationGroup/CreateSection#Specification","/App/directory-Manager/designing/combine/DataManagement/EquipGroup/CreateSection#Equip","/App/directory-Manager/designing/combine/DataManagement/Common/Material/ViewMaterial#Common","/App/directory-Manager/designing/combine/DataManagement/Common/Section/ViewSection#Common","/App/directory-Manager/designing/combine/DataManagement/Common/Material/EditMaterial#Common","/App/directory-Manager/designing/combine/DataManagement/SpecificationGroup/EditSection#Specification","/App/directory-Manager/designing/combine/DataManagement/EquipGroup/EditSection#Equip","/App/directory-Manager/designing/combine/DataManagement/Common/Material/DeleteMaterial#Common","/App/directory-Manager/designing/combine/DataManagement/Common/Section/DeleteSection#Common","/App/directory-Manager/designing/combine/ImportPanel","/App/directory-Manager/designing/combine/ImportPanel/ImportSection","/App/directory-Manager/designing/combine/ImportPanel/ImportSection/RepeaterSection","/App/directory-Manager/designing/combine/ImportPanel/ImportSection/RepeaterSection/RepeaterChildren","/App/directory-Manager/designing/combine/ImportPanel/ImportMaterials","/App/directory-Manager/designing/combine/ImportPanel/ImportMaterials/RepeaterMaterials","/App/directory-Manager/designing/combine/ActionPanel","/App/directory-Manager/designing/combine/ActionPanel/MaterialsDocumentManagement/CreateDocumentWithMaterials","/App/directory-Manager/designing/combine/ActionPanel/MaterialsDocumentManagement/AddingMaterialsToADocument","/App/directory-Manager/designing/combine/ActionPanel/MaterialsDocumentManagement/DeleteMaterialsFromDocument","/App/directory-Manager/designing/combine/ActionPanel/MoveMaterials","/App/directory-Manager/designing/combine/ActionPanel/MoveMaterials/RepeaterMoveMaterials","/App/directory-Manager/designing/combine/ActionPanel/MassRemovalMaterials","/App/directory-Manager/designing/combine/ActionPanel/ModalForImport","/App/directory-Manager/designing/combine/Table","/App/directory-Manager/designing/combine/data"],"dependencies":["b29-89dca6c4aaa7eaae","b23-790cd345b1d81c73","b22-01802f15dd562f73","b5-5d72410ab3cf159a","b25-8a3daab6fe5393da","b13-e038f0ff779a3219","b4-11dc35b052fb08a9","b11-5925e52ab8e5c9af","b26-a807d87e15b2922d"]},"b40-ec2da3ec4398a1ca":{"components":["/App/directory-Manager/designing/Все заказы покупателя","/App/directory-Manager/designing/Все заказы покупателя/DataManagmentFunctions/Common/Document/SetDate","/App/directory-Manager/designing/Все заказы покупателя/DataManagmentFunctions/ProjectMaterial/SetWithMarkup","/App/directory-Manager/designing/Все заказы покупателя/ActionePanel","/App/directory-Manager/designing/Все заказы покупателя/TableGroups","/App/directory-Manager/designing/Все заказы покупателя/surrealData"],"dependencies":["b36-c501f5dd41c07ef8","b41-f2f768f97bdb0b05","b43-2fb2bced63e61ce3"]},"b41-f2f768f97bdb0b05":{"components":["/App/directory-Manager/designing/Все заказы поставщика/ActionPanel/PaginationByPage"],"dependencies":["b42-7b70eea53ee77e62"]},"b42-7b70eea53ee77e62":{"components":["/App/directory-Manager/designing/Все калькуляции/ActionPanel/PaginationByPage/Item"],"dependencies":[]},"b43-2fb2bced63e61ce3":{"components":["/App/Shared/Logical/paginator"],"dependencies":[]},"b44-7893663135637633":{"components":["/App/directory-Manager/designing/Все заказы поставщика","/App/directory-Manager/designing/Все заказы поставщика/DataManagmentSuplierOrder/Common/Document/setDate","/App/directory-Manager/designing/Все заказы поставщика/DataManagmentSuplierOrder/Common/projectMaterial/SetValue","/App/directory-Manager/designing/Все заказы поставщика/ActionPanel","/App/directory-Manager/designing/Все заказы поставщика/TableGroups","/App/directory-Manager/designing/Все заказы поставщика/surrealData"],"dependencies":["b11-5925e52ab8e5c9af","b38-c5da15d0290fc208","b41-f2f768f97bdb0b05","b43-2fb2bced63e61ce3"]},"b45-253289e95cec6adf":{"components":["/App/directory-Manager/designing/Все калькуляции","/App/directory-Manager/designing/Все калькуляции/DataManagmentFunction/Document/SetDate","/App/directory-Manager/designing/Все калькуляции/DataManagmentFunction/projectCalculationWork/SetWithMarkup","/App/directory-Manager/designing/Все калькуляции/ActionPanel","/App/directory-Manager/designing/Все калькуляции/TableGroups","/App/directory-Manager/designing/Все калькуляции/surrealData"],"dependencies":["b4-11dc35b052fb08a9","b5-5d72410ab3cf159a","b21-a63e79eed4b7cc2a","b11-5925e52ab8e5c9af","b30-f734f9c5d9906602","b46-b4313e18a6f12159","b43-2fb2bced63e61ce3"]},"b46-b4313e18a6f12159":{"components":["/App/directory-Manager/designing/Все калькуляции/ActionPanel/PaginationByPage"],"dependencies":["b42-7b70eea53ee77e62"]},"b47-6a5174a3322ff077":{"components":["/App/directory-Manager/designing/Все заказ наряды","/App/directory-Manager/designing/Все заказ наряды/DataManagement/ProjectZnWork/SetStartDate","/App/directory-Manager/designing/Все заказ наряды/DataManagement/ProjectZnWork/SetEndDate","/App/directory-Manager/designing/Все заказ наряды/DataManagement/ProjectZnWork/SetValue","/App/directory-Manager/designing/Все заказ наряды/StatsPanel","/App/directory-Manager/designing/Все заказ наряды/StatsPanel/Сondition/line","/App/directory-Manager/designing/Все заказ наряды/StatsPanel/Сondition/CounterByStatus","/App/directory-Manager/designing/Все заказ наряды/ActionPanel","/App/Shared/Visual/PageContent/CounterOfSelectedItems","/App/directory-Manager/designing/Все заказ наряды/ActionPanel/DistributeDatesRange","/App/directory-Manager/designing/Все заказ наряды/ActionPanel/DistributeDatesRange/List","/App/directory-Manager/designing/Все заказ наряды/ActionPanel/ArchiveWorkOrders","/App/directory-Manager/designing/Все заказ наряды/ActionPanel/GroupWorkOrdersIntoPayment","/App/Shared/Visual/Dropdowns/ExecuteDropdownListTable","/App/directory-Manager/designing/Все заказ наряды/Table","/App/directory-Manager/designing/Все заказ наряды/surrealData"],"dependencies":["b21-a63e79eed4b7cc2a","b4-11dc35b052fb08a9","b5-5d72410ab3cf159a","b17-db50debabba39d9d","b11-5925e52ab8e5c9af","b48-f67c95e5c8474d43","b46-b4313e18a6f12159","b43-2fb2bced63e61ce3"]},"b48-f67c95e5c8474d43":{"components":["/App/directory-Manager/designing/Все заказ наряды/ActionPanel/PdfDocumentGeneration","/App/directory-Manager/designing/Все заказ наряды/ActionPanel/MassRemovalWorkOrders","/App/directory-Manager/designing/Все заказ наряды/ActionPanel/AssignBrigadeToWorkOrder","/App/directory-Manager/execution/work-order/ActionPanel/ResetChanges"],"dependencies":["b5-5d72410ab3cf159a","b4-11dc35b052fb08a9"]},"b49-a135985e4e77937f":{"components":["/App/directory-Manager/designing/График","/App/directory-Manager/designing/График/Head","/App/directory-Manager/designing/График/ActionPanel","/App/directory-Manager/designing/График/ActionPanel/DistributeDatesRange","/App/directory-Manager/designing/График/ActionPanel/SetDependencies","/App/directory-Manager/designing/График/ActionPanel/RemoveDependencies","/App/directory-Manager/designing/График/Table","/App/directory-Manager/designing/График/Guntt","/App/directory-Manager/designing/График/Guntt/item","/App/directory-Manager/designing/График/surrealData"],"dependencies":["b46-b4313e18a6f12159","b4-11dc35b052fb08a9","b5-5d72410ab3cf159a","b43-2fb2bced63e61ce3","b13-e038f0ff779a3219","b25-8a3daab6fe5393da"]},"b50-0ff4d3459a56506b":{"components":["/App/directory-Manager/directory/works","/App/directory-Manager/directory/works/Hierarchy header #work","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group/Table hierarchy L2 #work-group","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group/Table hierarchy L2 #work-group/Table hierarchy L3 #work-group","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group/Table hierarchy L2 #work-group/Table hierarchy L3 #work-group/Table hierarchy L4 #work-group","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group/Table hierarchy L2 #work-group/Table hierarchy L3 #work-group/Table hierarchy L4 #work-group/Table hierarchy L5 #work-group","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group/Table hierarchy L2 #work-group/Table hierarchy L3 #work-group/Table hierarchy L4 #work-group/Table hierarchy L5 #work-group/Table hierarchy L6 #work-group","/App/directory-Manager/directory/works/Table hierarchy L1 #work-group/Reset single selection #works","/App/directory-Manager/directory/works/UseData #work","/App/directory-Manager/directory/Resets directory/work/Reset UseData #work-group","/App/directory-Manager/directory/works/Сreation and editing #work-group","/App/directory-Manager/directory/works/Сreation and editing #work-group/Create #work-group","/App/directory-Manager/directory/works/Сreation and editing #work-group/Update #work-group","/App/directory-Manager/directory/works/Сreation and editing #work-group/Update #work-group/Delete #work-group","/App/directory-Manager/directory/works/Data management menu #work","/App/directory-Manager/directory/works/Table #work","/App/directory-Manager/directory/Resets directory/work/Reset Table #work","/App/directory-Manager/directory/works/Information drawer for work","/App/directory-Manager/directory/works/Information drawer for work/Delete #work","/App/directory-Manager/directory/works/Multiple editing #work","/App/directory-Manager/directory/works/Multiple editing #work/Multiple delete works","/App/directory-Manager/directory/works/Multiple editing #work/Multiple update works","/App/directory-Manager/directory/works/Сreation and editing #work","/App/directory-Manager/directory/works/Сreation and editing #work/Create #work","/App/directory-Manager/directory/works/Сreation and editing #work/Update #work"],"dependencies":["b16-dfdabd11356dc185"]},"b51-1a11e13c14007d94":{"components":["/App/directory-Manager/directory/materials","/App/directory-Manager/directory/materials/Hierarchy header #material","/App/directory-Manager/directory/materials/UseData #material","/App/directory-Manager/directory/Resets directory/material/Reset UseData #material-group","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group ","/App/directory-Manager/directory/materials/Сreation and editing #materal-group","/App/directory-Manager/directory/materials/Сreation and editing #materal-group/Create #material-group","/App/directory-Manager/directory/materials/Сreation and editing #materal-group/Update #material-group","/App/directory-Manager/directory/materials/Сreation and editing #materal-group/Update #material-group/Delete #material-group","/App/directory-Manager/directory/materials/Multiple editing #material","/App/directory-Manager/directory/materials/Multiple editing #material/Multiple delete materials","/App/directory-Manager/directory/materials/Multiple editing #material/Multiple update materials","/App/directory-Manager/directory/materials/Table #material","/App/directory-Manager/directory/materials/Table #material/Cell 5 m","/App/directory-Manager/directory/materials/Table #material/Cell 6 m","/App/directory-Manager/directory/materials/Table #material/Cell 7 m","/App/directory-Manager/directory/materials/Table #material/Cell hover buttom","/App/directory-Manager/directory/materials/Сreation and editing #material","/App/directory-Manager/directory/materials/Сreation and editing #material/Create material","/App/directory-Manager/directory/materials/Сreation and editing #material/Update material"],"dependencies":["b15-0159219143495046","b16-dfdabd11356dc185","b23-790cd345b1d81c73","b5-5d72410ab3cf159a"]},"b52-c21acabbd89a8da1":{"components":["/App/directory-Manager/directory/brigades","/App/directory-Manager/directory/brigades/archivedBrigade","/App/directory-Manager/directory/brigades/activated Brigade","/App/directory-Manager/directory/brigades/delete Brigade","/App/directory-Manager/directory/brigades/menu #brigades","/App/directory-Manager/directory/brigades/Table brigades #brigades","/App/directory-Manager/directory/brigades/Table brigades #brigades/Cell 0 #brigades","/App/directory-Manager/directory/brigades/Table brigades #brigades/Cell 1 #brigades","/App/directory-Manager/directory/brigades/Table brigades #brigades/Cell 1 #brigades/badge #workGroup","/App/directory-Manager/directory/brigades/createBrigade","/App/directory-Manager/directory/brigades/createBrigade/addWorks #brigade #createBrigade","/App/directory-Manager/directory/brigades/createBrigade/addWorks #brigade #createBrigade/Table lvl2 works #brigade","/App/directory-Manager/directory/brigades/createBrigade/addWorks #brigade #createBrigade/Table lvl2 works #brigade/Table lvl3 works #brigade","/App/directory-Manager/directory/brigades/createBrigade/addWorks #brigade #createBrigade/Table lvl2 works #brigade/Selected items wg #directory #brigade","/App/directory-Manager/directory/brigades/edit Brigade","/App/directory-Manager/directory/brigades/edit Brigade/addWorks #brigade #editBrigade","/App/directory-Manager/directory/brigades/edit Brigade/addWorks #brigade #editBrigade/Table lvl2 works #brigade #edit","/App/directory-Manager/directory/brigades/edit Brigade/addWorks #brigade #editBrigade/Table lvl2 works #brigade #edit/Table lvl3 works #brigade #edit","/App/directory-Manager/directory/brigades/edit Brigade/addWorks #brigade #editBrigade/Table lvl2 works #brigade #edit/Selected items wg #directory #brigade #edit","/App/directory-Manager/directory/brigades/view #brigade","/App/directory-Manager/directory/brigades/UseData #brigade","/App/directory-Manager/directory/brigades/Header works #brigades"],"dependencies":["b5-5d72410ab3cf159a"]},"b53-f96f9164a0a9391e":{"components":["/App/directory-Manager/execution/all-projects","/App/directory-Manager/execution/all-projects/ViewObject","/App/directory-Manager/execution/all-projects/ViewProject","/App/directory-Manager/execution/all-projects/StatsPanel","/App/directory-Manager/execution/all-projects/ActionPanel","/App/directory-Manager/execution/all-projects/TableObject","/App/directory-Manager/execution/all-projects/data"],"dependencies":["b13-e038f0ff779a3219"]},"b54-cd0fd907c5c8e941":{"components":["/App/directory-Manager/execution/estimate","/App/directory-Manager/execution/estimate/ActionPanel","/App/directory-Manager/execution/estimate/ActionPanel/WorkOrdersManagement/CreateWorkOrder","/App/directory-Manager/execution/estimate/ActionPanel/WorkOrdersManagement/AddingWorksToWorkOrder","/App/directory-Manager/execution/estimate/ActionPanel/WorkOrdersManagement/DeleteWorksFromWorkOrders","/App/directory-Manager/execution/estimate/Table","/App/directory-Manager/execution/estimate/surrealData"],"dependencies":["b55-2eb8aeb87a71354c","b26-a807d87e15b2922d","b5-5d72410ab3cf159a","b4-11dc35b052fb08a9","b18-179e944379d4d7a9","b13-e038f0ff779a3219","b25-8a3daab6fe5393da"]},"b55-2eb8aeb87a71354c":{"components":["/App/Shared/Visual/PageContent/HeadForPageExecution"],"dependencies":[]},"b56-c6b95d783aba8823":{"components":["/App/directory-Manager/execution/work-order","/App/directory-Manager/execution/work-order/ActionPanel","/App/directory-Manager/execution/work-order/ActionPanel/ArchiveWorkOrders","/App/directory-Manager/execution/work-order/Table","/App/directory-Manager/execution/work-order/data"],"dependencies":["b55-2eb8aeb87a71354c","b11-5925e52ab8e5c9af","b48-f67c95e5c8474d43","b13-e038f0ff779a3219"]},"b57-addbc273cab4fdec":{"components":["/App/directory-Manager/execution/all-work-orders","/App/directory-Manager/execution/all-work-orders/zn addComment Modal","/App/directory-Manager/execution/all-work-orders/Statistics for all zn","/App/directory-Manager/execution/all-work-orders/Data managment menu #execution #all-work-orders","/App/directory-Manager/execution/all-work-orders/Data managment menu #execution #all-work-orders/Сhange status on work order","/App/directory-Manager/execution/all-work-orders/Data managment menu #execution #all-work-orders/Assign work order to the brigade","/App/directory-Manager/execution/all-work-orders/Table lvl 1 #all-work-orders","/App/directory-Manager/execution/all-work-orders/Table lvl 1 #all-work-orders/Table lvl 2 #all-work-orders","/App/directory-Manager/execution/all-work-orders/Table lvl 1 #all-work-orders/Table lvl 2 #all-work-orders/Table lvl 3 #all-work-orders","/App/Shared/Visual/Cells/Cells with history/OldRK/AnyGrouping/Cell MD","/App/Shared/Visual/Cells/Cells with history/OldRK/AnyGrouping/Cell MD percent","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell MD","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell MD percent","/App/directory-Manager/execution/all-work-orders/Table lvl 1 #all-work-orders/addComment #all-work-orders","/App/directory-Manager/execution/all-work-orders/Mass removal project-zn","/App/directory-Manager/execution/all-work-orders/Work order PDF document","/App/directory-Manager/execution/work-order/Old/Work order PDF document/Changeds workOrder","/App/directory-Manager/execution/all-work-orders/Grouping work orders","/App/directory-Manager/execution/all-work-orders/Archive work orders","/App/directory-Manager/execution/all-work-orders/filters + useData project-zn"],"dependencies":["b32-8e7a57fbaf264c6e","b31-f978c978d5464191","b19-6a2634e394ec5178","b58-65139cfc7af20380"]},"b58-65139cfc7af20380":{"components":["/App/Shared/Visual/Cells/ProjectWorkGroup/Old RK/Cell 0 forProjectWorkGroup (Old RK)","/App/Shared/Visual/Cells/ProjectWork/Old RK/Cell 0 forProjectWork (Old RK)"],"dependencies":[]},"b59-c32db742af12bdf1":{"components":["/App/directory-Manager/execution/payments","/App/directory-Manager/execution/payments/DataManagement/ProjectZnGroup/SetDate","/App/directory-Manager/execution/payments/DataManagement/ProjectZnWorkGroup/SetPayment","/App/directory-Manager/execution/payments/DataManagement/ProjectZnGroup/SetCommentInGroup","/App/directory-Manager/execution/payments/DataManagement/ProjectZnWorkGroup/SetCommentInSection","/App/directory-Manager/execution/payments/ActionPanel","/App/directory-Manager/execution/payments/ActionPanel/PdfDocumentGeneration","/App/directory-Manager/execution/payments/ActionPanel/ArchiveGroups","/App/directory-Manager/execution/payments/ActionPanel/DeleteGroups","/App/directory-Manager/execution/payments/TableGroups","/App/directory-Manager/execution/payments/data"],"dependencies":["b11-5925e52ab8e5c9af","b13-e038f0ff779a3219"]},"b60-d4dd570a1c6c0c57":{"components":["/App/directory-Manager/execution/journal of all work orders","/App/directory-Manager/execution/journal of all work orders/DataManagment/ProjectZnWorks/SetRealDateStart","/App/directory-Manager/execution/journal of all work orders/DataManagment/ProjectZnWorks/SetRealDateEnd","/App/directory-Manager/execution/journal of all work orders/DataManagment/ProjectZnWorks/SetRealQuantity","/App/directory-Manager/execution/journal of all work orders/DataManagment/ProjectZn/SetReport","/App/directory-Manager/execution/journal of all work orders/DataManagment/ProjectZn/SetReport/displayReport","/App/directory-Manager/execution/journal of all work orders/ActionPanel","/App/directory-Manager/execution/journal of all work orders/ActionPanel/ArchivedDocuments","/App/directory-Manager/execution/journal of all work orders/ActionPanel/SetMassProgress","/App/directory-Manager/execution/journal of all work orders/ActionPanel/WorkRecordsManagment/CreateWorkRecord","/App/directory-Manager/execution/journal of all work orders/ActionPanel/WorkRecordsManagment/CreateWorkRecord/Validate","/App/directory-Manager/execution/journal of all work orders/ActionPanel/BrigadeWorkRecordPdfForm","/App/directory-Manager/execution/journal of all work orders/ActionPanel/ClientWorkRecordPdfForm","/App/directory-Manager/execution/journal of all work orders/Table","/App/directory-Manager/execution/journal of all work orders/Old","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Сhange status on work order in journal","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/Create work record","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/Create work record/table","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/table lvl 2 #journal","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/table lvl 2 #journal/table lvl 3 #journal","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/progress section","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/table lvl 2 #journal/table lvl 3 #journal/date input start","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/table lvl 2 #journal/table lvl 3 #journal/date input end","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/table lvl 2 #journal/table lvl 3 #journal/quantity input","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/table lvl 2 #journal/table lvl 3 #journal/progress","/App/directory-Manager/execution/journal of all work orders/Old/open create act ispolnitel (brigade) pdf","/App/directory-Manager/execution/journal of all work orders/Old/open act zakazchik (client) pdf","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/Add works to work record","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/remove work in brigade work record","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/remove work in client work record","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/servese order dpf managment","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/addImage","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/progress zn","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Archive work orders in journal","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Progress of the work in journal","/App/directory-Manager/execution/journal of all work orders/Old/ManageReportsInWorkOrder","/App/directory-Manager/execution/journal of all work orders/Old/ManageReportsInWorkOrder/displayReport","/App/directory-Manager/execution/journal of all work orders/Old/filters + useData project-zn #journal of all work orders","/App/directory-Manager/execution/journal of all work orders/paginationData"],"dependencies":["b5-5d72410ab3cf159a","b61-60c6a67828be8380","b4-11dc35b052fb08a9","b24-3586ac88f271e4b0","b11-5925e52ab8e5c9af","b46-b4313e18a6f12159","b62-ab743c58402d7964","b26-a807d87e15b2922d","b31-f978c978d5464191","b58-65139cfc7af20380","b13-e038f0ff779a3219"]},"b61-60c6a67828be8380":{"components":["/App/Shared/Logical/customDelay"],"dependencies":["b5-5d72410ab3cf159a"]},"b62-ab743c58402d7964":{"components":["/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/CreateBrigadeCompletionAct"],"dependencies":["b5-5d72410ab3cf159a","b4-11dc35b052fb08a9"]},"b63-1a2faabf65ecd09d":{"components":["/App/directory-Manager/execution/Журнал всех заказ нарядов","/App/directory-Manager/execution/Журнал всех заказ нарядов/DataManagment/ProjectZnWorks/DistributeDatesRange","/App/directory-Manager/execution/Журнал всех заказ нарядов/DataManagment/ProjectZnWorks/DistributeDatesRange/List","/App/directory-Manager/execution/Журнал всех заказ нарядов/StatsPanel","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ActsModeFunctions/PdfDocumentGeneration","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ActsModeFunctions/PdfDocumentGeneration/ChangedsValue","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/JournalModeFunctions/ArchivedDocuments","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ActsModeFunctions/MassRemovalBrigadeCompletionActs","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ActsModeFunctions/MassUnbindWorks","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/CreateProgressRecord","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/ManagingSelectedItems","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/ManagingSelectedItems/Table","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/AddingWorksToProgressRecord","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/AddingWorksToBrigadeCompletionAct","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ActsModeFunctions/ResetChanges","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ActsModeFunctions/GroupWorkOrdersIntoPayment","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table","/App/directory-Manager/execution/Журнал всех заказ нарядов/surrealData"],"dependencies":["b4-11dc35b052fb08a9","b11-5925e52ab8e5c9af","b26-a807d87e15b2922d","b46-b4313e18a6f12159","b62-ab743c58402d7964","b5-5d72410ab3cf159a","b61-60c6a67828be8380","b43-2fb2bced63e61ce3"]},"b64-b2d1fe9e759abc19":{"components":["/App/directory-Manager/execution/Журнал всех калькуляций","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/JournalModeFunctions/ArchiveDocument","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ActsModeFunction/PdfDocumentGeneration","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ActsModeFunction/PdfDocumentGeneration/ChangedsWithMarkup","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ActsModeFunction/MassRemovalClientAcceptanceActs","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ActsModeFunction/MassUnbindWorks","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/CreateClientAcceptanceAct","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/AddingWorksToClientAcceptanceAct","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ActsModeFunction/ResetChanges","/App/directory-Manager/execution/Журнал всех калькуляций/Table","/App/directory-Manager/execution/Журнал всех калькуляций/surrealData"],"dependencies":["b11-5925e52ab8e5c9af","b46-b4313e18a6f12159","b26-a807d87e15b2922d","b4-11dc35b052fb08a9","b61-60c6a67828be8380","b5-5d72410ab3cf159a","b43-2fb2bced63e61ce3"]},"b65-d64b8a04f2d1be42":{"components":["/App/directory-Manager/execution/Журнал производства работ","/App/directory-Manager/execution/Журнал производства работ/StatsPanel","/App/directory-Manager/execution/Журнал производства работ/ActionPanel","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/ChangeFlowStateLocal","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/ChangeFlowStateLocal/Cell 0","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/ChangeFlowStateLocal/Cell 1","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/ArchivedRecords","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/MassRemovalProgressRecords","/App/directory-Manager/execution/Журнал производства работ/Table","/App/directory-Manager/execution/Журнал производства работ/surrealData"],"dependencies":["b46-b4313e18a6f12159","b4-11dc35b052fb08a9","b5-5d72410ab3cf159a","b61-60c6a67828be8380","b43-2fb2bced63e61ce3"]},"b66-8d349e12be286832":{"components":["/App/directory-Manager/execution/schedule/tabelSchedule","/App/directory-Manager/execution/schedule/Tabel lvl 1 #schedule","/App/directory-Manager/execution/schedule/Tabel lvl 1 #schedule/Tabel lvl 2 #schedule","/App/directory-Manager/execution/schedule/Tabel lvl 1 #schedule/Tabel lvl 2 #schedule/Tabel lvl 3 #schedule","/App/directory-Manager/execution/schedule/Tabel lvl 1 #schedule/Tabel lvl 2 #schedule/Tabel lvl 3 #schedule/relations column #scedule"],"dependencies":["b13-e038f0ff779a3219","b25-8a3daab6fe5393da"]},"b67-4ca723aa81e80881":{"components":["/App/directory-Manager/execution/schedule/graphGantt","/App/directory-Manager/execution/schedule/graphGantt/projGroupGantt"],"dependencies":["b13-e038f0ff779a3219","b25-8a3daab6fe5393da"]},"b68-52ad554919cac5eb":{"components":["/App/admin/cabinet/users/Table Test","/App/architect/architect #navigate","/App/architect/architect #navigate/projects #navigate","/App/architect/architect #navigate/specification #navigate","/App/auth","/App/directory-Manager/designing/Все заказ наряды/data","/App/directory-Manager/designing/Все заказ наряды/Table/Cell flowStatusDot","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/Brigade","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/Brigade/Item","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/EndDate","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/EndDate/Item","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/MDDay","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/MDPercent","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/Object","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/Object/Item","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/StartDate","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/StartDate/Item","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/State","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/State/Item","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/TotalValue","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/TotalWithMarkup","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/Type","/App/directory-Manager/designing/Все заказ наряды/Table/Filters/Type/Item","/App/directory-Manager/designing/Все заказ наряды/Table/SubTable","/App/directory-Manager/designing/Все заказ наряды/Table/SubTable/Cell 5","/App/directory-Manager/designing/Все заказ наряды/Table/SubTable/Cell 6","/App/directory-Manager/designing/Все заказ наряды/Table/SubTable/Cell 9","/App/directory-Manager/designing/Все заказы покупателя/kuzzleData","/App/directory-Manager/designing/Все заказы покупателя/TableGroups/Cell 2","/App/directory-Manager/designing/Все заказы покупателя/TableGroups/Cell 6","/App/directory-Manager/designing/Все заказы покупателя/TableGroups/Filters/Objects","/App/directory-Manager/designing/Все заказы покупателя/TableGroups/Filters/Objects/Item","/App/directory-Manager/designing/Все заказы покупателя/TableGroups/SubTable","/App/directory-Manager/designing/Все заказы покупателя/TableGroups/SubTable/Cell 11 setWithMarkup","/App/directory-Manager/designing/Все заказы поставщика/ActionPanel/PaginationByPage/Item","/App/directory-Manager/designing/Все заказы поставщика/kuzzleData","/App/directory-Manager/designing/Все заказы поставщика/TableGroups/Cell 2","/App/directory-Manager/designing/Все заказы поставщика/TableGroups/Filters/Objects","/App/directory-Manager/designing/Все заказы поставщика/TableGroups/Filters/Objects/Item","/App/directory-Manager/designing/Все заказы поставщика/TableGroups/SubTable","/App/directory-Manager/designing/Все заказы поставщика/TableGroups/SubTable/Cell 14 setValue","/App/directory-Manager/designing/Все калькуляции/ActionPanel/PaginationByString","/App/directory-Manager/designing/Все калькуляции/data","/App/directory-Manager/designing/Все калькуляции/data copy","/App/directory-Manager/designing/Все калькуляции/TableGroups/Cell 1","/App/directory-Manager/designing/Все калькуляции/TableGroups/Cell 6","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/Markup percent","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/Object","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/Object/Item","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/State","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/State/Item","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/TotalValue","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/TotalWithMarkup","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/TypeDocument","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/TypeDocument/Item","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/WorkOrders","/App/directory-Manager/designing/Все калькуляции/TableGroups/Filters/WorkOrders/Item","/App/directory-Manager/designing/Все калькуляции/TableGroups/SubTable","/App/directory-Manager/designing/Все калькуляции/TableGroups/SubTable/Cell 14 setWithMarkup","/App/directory-Manager/designing/График/ActionPanel/DistributeDatesRange/Cell 0 name","/App/directory-Manager/designing/График/ActionPanel/DistributeDatesRange/Cell 1 startDate","/App/directory-Manager/designing/График/ActionPanel/DistributeDatesRange/Cell 2 endDate","/App/directory-Manager/designing/График/ActionPanel/DistributeDatesRange/Cell 3 daysCount","/App/directory-Manager/designing/График/kuzzleData","/App/directory-Manager/designing/График/Table/SubTable","/App/directory-Manager/designing/График/Table/SubTable/Cell 0","/App/directory-Manager/designing/График/Table/SubTable/SubTableWorks","/App/directory-Manager/designing/График/Table/SubTable/SubTableWorks/Cell 4 Liaison","/App/directory-Manager/designing/calculation/Old/Data managment menu #calculation/Archived toggle switch","/App/directory-Manager/designing/calculation/Table/Cell 12","/App/directory-Manager/designing/calculation/Table/Filters/Changes","/App/directory-Manager/designing/calculation/Table/Filters/Changes/Item","/App/directory-Manager/designing/calculation/Table/Filters/TypesOfWork","/App/directory-Manager/designing/calculation/Table/Filters/TypesOfWork/Item","/App/directory-Manager/designing/calculation/Table/SubTable","/App/directory-Manager/designing/combine/Table/Cell 0","/App/directory-Manager/designing/combine/Table/Filters/Brands","/App/directory-Manager/designing/combine/Table/Filters/Brands/Item","/App/directory-Manager/designing/combine/Table/Filters/Categories","/App/directory-Manager/designing/combine/Table/Filters/Categories/Item","/App/directory-Manager/designing/combine/Table/Filters/CategoriesSpecificationMode","/App/directory-Manager/designing/combine/Table/Filters/CategoriesSpecificationMode/Item","/App/directory-Manager/designing/combine/Table/Filters/NumberEqupMode","/App/directory-Manager/designing/combine/Table/Filters/NumberEqupMode/Item","/App/directory-Manager/designing/combine/Table/Filters/OrderSuplierEquipMode","/App/directory-Manager/designing/combine/Table/Filters/OrderSuplierEquipMode/Item","/App/directory-Manager/designing/combine/Table/Filters/Rooms","/App/directory-Manager/designing/combine/Table/Filters/Rooms/Item","/App/directory-Manager/designing/combine/Table/Filters/RoomsEquipMode","/App/directory-Manager/designing/combine/Table/Filters/RoomsEquipMode/Item","/App/directory-Manager/designing/combine/Table/Filters/SpecificationEquipMode","/App/directory-Manager/designing/combine/Table/Filters/SpecificationEquipMode/Item","/App/directory-Manager/designing/combine/Table/Filters/Statuses","/App/directory-Manager/designing/combine/Table/Filters/Statuses/Item","/App/directory-Manager/designing/combine/Table/Filters/Units","/App/directory-Manager/designing/combine/Table/Filters/Units/Item","/App/directory-Manager/designing/combine/Table/SubTable","/App/directory-Manager/designing/estimate/ActionPanel/CalculationManagement/AddingWorksToADocument","/App/directory-Manager/designing/estimate/ActionPanel/CalculationManagement/CreateDocumentWithWorks","/App/directory-Manager/designing/estimate/ActionPanel/CalculationManagement/DeleteWorksFromDocument","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWork/EditWork copy","/App/directory-Manager/designing/estimate/DataManagementFunctions/ProjectWorkGroup/EditSection#Common copy","/App/directory-Manager/designing/estimate/Distribution/TableEquip/SubTableEquip","/App/directory-Manager/designing/estimate/Distribution/TableEstimate/SubTableEstimate","/App/directory-Manager/designing/estimate/Distribution/TableEstimate/SubTableEstimate/Cell 3","/App/directory-Manager/designing/estimate/Distribution/TableEstimate/SubTableEstimate/SubTableMaterialsEstimate","/App/directory-Manager/designing/estimate/HeadForPageWithWorksAndMaterials #deprecated","/App/directory-Manager/designing/estimate/HeadWithStats/Cell 0","/App/directory-Manager/designing/estimate/HeadWithStats/Cell 1","/App/directory-Manager/designing/estimate/HeadWithStats/Cell 2","/App/directory-Manager/designing/estimate/HeadWithStats/Cell 3","/App/directory-Manager/designing/estimate/kuzzleData","/App/directory-Manager/designing/estimate/Table/Filters/Calculations","/App/directory-Manager/designing/estimate/Table/Filters/Calculations/Item","/App/directory-Manager/designing/estimate/Table/SubTable","/App/directory-Manager/designing/estimate/Table/SubTable/SubTableMaterials","/App/directory-Manager/designing/Header components/inside the project, renovation/Dropdown navigation,type renovation #equip","/App/directory-Manager/designing/Header components/inside the project, renovation/Dropdown navigation,type renovation #specification","/App/directory-Manager/designing/Header components/inside the project,design/Dropdown navigation,type design #equip","/App/directory-Manager/designing/Header components/inside the project,design/Dropdown navigation,type design #specification","/App/directory-Manager/designing/order-customer/Old/Page information header #customer","/App/directory-Manager/designing/order-customer/Table/Filters/Changes","/App/directory-Manager/designing/order-customer/Table/Filters/Changes/Item","/App/directory-Manager/designing/order-customer/Table/Filters/Statuses","/App/directory-Manager/designing/order-customer/Table/Filters/Statuses/Item","/App/directory-Manager/designing/order-customer/Table/SubTable","/App/directory-Manager/designing/order-suplier/Old/Data managment menu #suplier/Page information header #suplier","/App/directory-Manager/designing/order-suplier/Table/SubTable","/App/directory-Manager/designing/projects/Table/SubTable","/App/directory-Manager/designing/projects/Table/SubTable/Cell 7","/App/directory-Manager/designing/Resets designing/equip/Reset Table #equip","/App/directory-Manager/designing/Resets designing/equip/Reset UseData #equip","/App/directory-Manager/designing/Resets designing/estimate/Reset Table #estimate","/App/directory-Manager/designing/Resets designing/estimate/Reset UseData #project-work-group","/App/directory-Manager/designing/Resets designing/projects/Reset Table #designing #projects","/App/directory-Manager/designing/specForms/Old","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Сhange the status of specForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Archived #specForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Archived toggle switch #SpecForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Create && edit comment #specForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Delete #SpecForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Download && preview pdf #specForms","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Download && preview pdf #specForms copy","/App/directory-Manager/designing/specForms/Old/Data managment menu #specForms/Remove changes #specForms","/App/directory-Manager/designing/specForms/Old/Page information header #specForms","/App/directory-Manager/designing/specForms/Old/Table lvl 1 #SpecForms","/App/directory-Manager/designing/specForms/Old/Table lvl 1 #SpecForms/Table lvl 2 #SpecForms","/App/directory-Manager/designing/specForms/Old/Table lvl 1 #SpecForms/Table lvl 2 #SpecForms/Table lvl 3 #SpecForms","/App/directory-Manager/designing/specForms/Table/SubTable","/App/directory-Manager/designing/specification/Adding materials from the directory/Boofer/Moving materials for directory #specification/Repeater moving materials for directory copy","/App/directory-Manager/designing/specification/Data management menu #specification/Upload to excel","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Import materials TEST","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Moving materials for import","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Moving materials for import/Repeater moving materials for import","/App/directory-Manager/designing/specification/Import material #specification/Importing materials from another project/Moving materials for import/Repeater moving materials for import copy","/App/directory-Manager/designing/specification/Information drawer for material #specification/Delete image","/App/directory-Manager/designing/specification/Moving materials/Repeater moving materials copy","/App/directory-Manager/designing/specification/Table Level 1/Cell material/Cell 6","/App/directory-Manager/designing/specification/Table Level 1/Cell material/Cell 7","/App/directory-Manager/designing/specification/Table Level 1/Cell section/Cell 6 pmg","/App/directory-Manager/designing/specification/Table Level 1/Cell section/Cell 7 pmg","/App/directory-Manager/directory/materials/Сreation and editing #material/Update material/Upload image update #material #experimental","/App/directory-Manager/directory/materials/Data management menu #material/DropdownImportMaterialsFromExcelFile old","/App/directory-Manager/directory/materials/Table hierarchy L1 #material-group /selected material-group","/App/directory-Manager/directory/materials/uploadImage","/App/directory-Manager/directory/Resets directory/material/Reset Table #material-group","/App/directory-Manager/directory/works/Сreation and editing #work/[ Create work #ancestors ]","/App/directory-Manager/directory/works/Сreation and editing #work/[ Update work #ancestors ]","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/AddingWorksToBrigadeCompletionAct/Cell 0","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/AddingWorksToBrigadeCompletionAct/Cell 1","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/AddingWorksToBrigadeCompletionAct/Cell 2","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/CreateBrigadeCompletionAct/Cell 0","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/CreateBrigadeCompletionAct/Cell 1","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/BrigadeCompletionActManagement/CreateBrigadeCompletionAct/Cell 2","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/BrigadeWorkRecordPdfForm","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/ClientWorkRecordPdfForm","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/SetMassProgress","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 1 quantity","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 2 groupWorkload","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 2 workload","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 3 groupStartDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 3 startDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 4 endDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/OLD/Table progressRecord/SubTable/Cell 4 groupEndDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/AddingWorksToProgressRecord/Cell 5 addReport","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/AddingWorksToProgressRecord/Cell 5 addReport/AddReport","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 0","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 1 quantity","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 2 workload","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 3 startDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 4 endDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 5 addReport","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 5 addReport/AddReport","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 5 addReport/AddReport/Carousel","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 5 addReport/AddReport/Carousel/ViewImage","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/Cells/Cell 5 addReport/AddReport/setReports","/App/directory-Manager/execution/Журнал всех заказ нарядов/ActionPanel/ProgressRecordsManagement/Shared/ManagingSelectedItems/Table/SubTable","/App/directory-Manager/execution/Журнал всех заказ нарядов/Cells/CellsGrouping/Cell progress","/App/directory-Manager/execution/Журнал всех заказ нарядов/Debug - Удаление лишних записей о прогрессе","/App/directory-Manager/execution/Журнал всех заказ нарядов/Debug - Удаление лишних записей о прогрессе/surrealDataGetAllProgressRecords","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Cell 6 startDate","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsBrigade","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsBrigade/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsBrigadeCompletionAct","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsBrigadeCompletionAct/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsObject","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsObject/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsStates","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/ActsStates/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalBrigade","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalBrigade/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalChanges","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalChanges/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalFactQuantity","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalFactQuantity/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalObject","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalObject/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalState","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalState/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalWorkOrders","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalWorkOrders/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalWorks #debug","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/Filters/JournalWorks #debug/Item","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/SubTable","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/SubTable/Cell 11 progress","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/SubTable/Cell FactQuantity","/App/directory-Manager/execution/Журнал всех заказ нарядов/Table/SubTable/Cell QuantityClosedActs","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/AddingWorksToClientAcceptanceAct/Cell 0","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/AddingWorksToClientAcceptanceAct/Cell 1","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/AddingWorksToClientAcceptanceAct/Cell 2","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/CreateClientAcceptanceAct/Cell 1","/App/directory-Manager/execution/Журнал всех калькуляций/ActionPanel/ClientAcceptanceAct/CreateClientAcceptanceAct/Cell 2","/App/directory-Manager/execution/Журнал всех калькуляций/Cells/CellsGrouping/Cell progress","/App/directory-Manager/execution/Журнал всех калькуляций/Cells/CellsGrouping/CellsBadgeState","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActObjects","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActObjects/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActsClientAcceptanceAct","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActsClientAcceptanceAct/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActState","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActState/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActWorkOrder","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/ActWorkOrder/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalCalculation","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalCalculation/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalFactQuantity","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalFactQuantity/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalObjects","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalObjects/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalState","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalState/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalWorkOrder","/App/directory-Manager/execution/Журнал всех калькуляций/Table/Filters/JournalWorkOrder/Item","/App/directory-Manager/execution/Журнал всех калькуляций/Table/SubTable","/App/directory-Manager/execution/Журнал всех калькуляций/Table/SubTable/Cell 11 progress","/App/directory-Manager/execution/Журнал всех калькуляций/Table/SubTable/Cell FactQuantity","/App/directory-Manager/execution/Журнал всех калькуляций/Table/SubTable/Cell QuantityClosedActs","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 0","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 1 quantity","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 2 workload","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 3 startDate","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 4 endDate","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 5 addReport","/App/directory-Manager/execution/Журнал производства работ/ActionPanel/EditProgressRecord/Cells/Cell 5 addReport/AddReport","/App/directory-Manager/execution/Журнал производства работ/Debug - Удаление лишних записей о прогрессе","/App/directory-Manager/execution/Журнал производства работ/Debug - Удаление лишних записей о прогрессе/surrealDataGetAllWorkOrders","/App/directory-Manager/execution/Журнал производства работ/Table/Cell 0 changeCreateDate","/App/directory-Manager/execution/Журнал производства работ/Table/Cell 0 changeCreateDate/ChangeCreateDate","/App/directory-Manager/execution/Журнал производства работ/Table/Cell 13 isReport","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/Brigades","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/Brigades/Item","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/Objects","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/Objects/Item","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/States","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/States/Item","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/WorkOrders","/App/directory-Manager/execution/Журнал производства работ/Table/Filters/WorkOrders/Item","/App/directory-Manager/execution/Журнал производства работ/Table/SubTable","/App/directory-Manager/execution/Журнал производства работ/Table/SubTable/Cell 13 report","/App/directory-Manager/execution/Журнал производства работ/Table/SubTable/Cell 13 report/ViewReport","/App/directory-Manager/execution/Журнал производства работ/Table/SubTable/SubTable","/App/directory-Manager/execution/all-projects/TableObject/SubTableProject","/App/directory-Manager/execution/all-projects/TableObject/SubTableProject/Cell 2","/App/directory-Manager/execution/all-projects/TableObject/SubTableProject/SubTableProjectGroup","/App/directory-Manager/execution/all-projects/TableObject/SubTableProject/SubTableProjectGroup/SubTableProjectZn","/App/directory-Manager/execution/all-projects/TableObject/SubTableProject/SubTableProjectGroup/SubTableProjectZn/Cell 2","/App/directory-Manager/execution/all-projects/TableObject/SubTableProject/SubTableProjectGroup/SubTableProjectZn/Cell 3","/App/directory-Manager/execution/all-work-orders/Create PDF #all-work-orders copy","/App/directory-Manager/execution/all-work-orders/Usedata #execution #all-work-orders","/App/directory-Manager/execution/estimate/kuzzleData","/App/directory-Manager/execution/estimate/Old","/App/directory-Manager/execution/estimate/Old/Create project-zn #zn","/App/directory-Manager/execution/estimate/Old/Create project-zn #zn copy","/App/directory-Manager/execution/estimate/Old/Data managment menu #execution #estimate","/App/directory-Manager/execution/estimate/Old/Data managment menu #execution #estimate/Work orders managment","/App/directory-Manager/execution/estimate/Old/Data managment menu #execution #estimate/work orders/Add works to work order","/App/directory-Manager/execution/estimate/Old/Data managment menu #execution #estimate/work orders/Create work order","/App/directory-Manager/execution/estimate/Old/Data managment menu #execution #estimate/work orders/Remove works in work orders","/App/directory-Manager/execution/estimate/Old/Moving work to another work order #zn","/App/directory-Manager/execution/estimate/Old/Page information header #execution #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate/Table lvl 2 #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate/Table lvl 2 #estimate/Table lvl 3 #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate/Table lvl 2 #estimate/Table lvl 3 #estimate/Table lvl 4 #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate/Table lvl 2 #estimate/Table lvl 3 #estimate/Table lvl 4 #estimate/Table lvl 5 #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate/Table lvl 2 #estimate/Table lvl 3 #estimate/Table lvl 4 #estimate/Table lvl 5 #estimate/Table lvl 6 #estimate","/App/directory-Manager/execution/estimate/Old/Table lvl 1 #estimate/Table lvl 2 #estimate/Table lvl 3 #estimate/Table lvl 4 #estimate/Table lvl 5 #estimate/Table lvl 6 #estimate/Table lvl 7 #estimate","/App/directory-Manager/execution/estimate/Old/tableMaterials lvl 1","/App/directory-Manager/execution/estimate/Old/tableMaterials lvl 1/tableMaterials lvl 2","/App/directory-Manager/execution/estimate/Old/tableMaterials lvl 1/tableMaterials lvl 2/tableMaterials lvl 3","/App/directory-Manager/execution/estimate/Old/tableMaterials lvl 1/tableMaterials lvl 2/tableMaterials lvl 3/tableMaterials lvl 4","/App/directory-Manager/execution/estimate/Old/tableMaterials lvl 1/tableMaterials lvl 2/tableMaterials lvl 3/tableMaterials lvl 4/tableMaterials lvl 5","/App/directory-Manager/execution/estimate/Old/UseData #execution #estimate","/App/directory-Manager/execution/estimate/Old/WorkOrdersManagement/AddingWorksToWorkOrder","/App/directory-Manager/execution/estimate/Old/WorkOrdersManagement/CreateWorkOrder","/App/directory-Manager/execution/estimate/Old/WorkOrdersManagement/DeleteWorksFromWorkOrders","/App/directory-Manager/execution/estimate/Table/Filters/Brigades","/App/directory-Manager/execution/estimate/Table/Filters/Brigades/Item","/App/directory-Manager/execution/estimate/Table/Filters/WorkGroups","/App/directory-Manager/execution/estimate/Table/Filters/WorkGroups/Item","/App/directory-Manager/execution/estimate/Table/SubTable","/App/directory-Manager/execution/estimate/Table/SubTable/SubTableMaterials","/App/directory-Manager/execution/journal of all work orders/ActionPanel/WorkRecordsManagment/CreateWorkRecord copy","/App/directory-Manager/execution/journal of all work orders/ActionPanel/WorkRecordsManagment/CreateWorkRecord copy/Validate","/App/directory-Manager/execution/journal of all work orders/Cells/Cells sections/Cell 12 progress sections","/App/directory-Manager/execution/journal of all work orders/data","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/dpopdown acts","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/Create work record copy 2","/App/directory-Manager/execution/journal of all work orders/Old/Data managment menu #execution #journal/Work records managment/Create work record copy 2/table","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/Filters","/App/directory-Manager/execution/journal of all work orders/Old/table lvl 1 #journal/filtersSpecifications","/App/directory-Manager/execution/journal of all work orders/Table/Cell 21 setReport","/App/directory-Manager/execution/journal of all work orders/Table/Filters/Brigade","/App/directory-Manager/execution/journal of all work orders/Table/Filters/Brigade/Item","/App/directory-Manager/execution/journal of all work orders/Table/Filters/Object","/App/directory-Manager/execution/journal of all work orders/Table/Filters/Object/Item","/App/directory-Manager/execution/journal of all work orders/Table/Filters/Responsible","/App/directory-Manager/execution/journal of all work orders/Table/Filters/Responsible/Item","/App/directory-Manager/execution/journal of all work orders/Table/Filters/State","/App/directory-Manager/execution/journal of all work orders/Table/Filters/State/Item","/App/directory-Manager/execution/journal of all work orders/Table/Filters/WorkOrders","/App/directory-Manager/execution/journal of all work orders/Table/Filters/WorkOrders/Item","/App/directory-Manager/execution/journal of all work orders/Table/SubTable","/App/directory-Manager/execution/journal of all work orders/Table/SubTable/Cell 12 progress works","/App/directory-Manager/execution/journal of all work orders/Table/SubTable/Cell 14 realQuantity","/App/directory-Manager/execution/journal of all work orders/Table/SubTable/Cell 6 realDateStart","/App/directory-Manager/execution/journal of all work orders/Table/SubTable/Cell 7 realDateEnd","/App/directory-Manager/execution/payments/OldComponents/create excel file ","/App/directory-Manager/execution/payments/TableGroups/Cell 10","/App/directory-Manager/execution/payments/TableGroups/Cell 11","/App/directory-Manager/execution/payments/TableGroups/Cell 9","/App/directory-Manager/execution/payments/TableGroups/Filters/Brigade","/App/directory-Manager/execution/payments/TableGroups/Filters/Brigade/Item","/App/directory-Manager/execution/payments/TableGroups/Filters/Objects","/App/directory-Manager/execution/payments/TableGroups/Filters/Objects/Item","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders/Cell 1","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders/SubTableSections","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders/SubTableSections/Cell 11","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders/SubTableSections/Cell 6","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders/SubTableSections/Cell 8","/App/directory-Manager/execution/payments/TableGroups/SubTableWorkOrders/SubTableSections/SubTableOthers","/App/directory-Manager/execution/Resets execution/all-work-orders/Reset Table #all-work-orders","/App/directory-Manager/execution/Resets execution/work-order/Reset Table #work-order","/App/directory-Manager/execution/work-order/Old","/App/directory-Manager/execution/work-order/Old/Archive work orders","/App/directory-Manager/execution/work-order/Old/Assign work order to the brigade","/App/directory-Manager/execution/work-order/Old/Data management menu #execution #work-order","/App/directory-Manager/execution/work-order/Old/Data management menu #execution #work-order/Сhange status on work order","/App/directory-Manager/execution/work-order/Old/Data management menu #execution #work-order/Remove changes #workOrder","/App/directory-Manager/execution/work-order/Old/Mass removal project-zn","/App/directory-Manager/execution/work-order/Old/Mass removal project-zn copy","/App/directory-Manager/execution/work-order/Old/Table lvl 1 #work-order","/App/directory-Manager/execution/work-order/Old/Table lvl 1 #work-order/Table lvl 2 #work-order","/App/directory-Manager/execution/work-order/Old/Table lvl 1 #work-order/Table lvl 2 #work-order/Table lvl 3 #work-order","/App/directory-Manager/execution/work-order/Old/Table lvl 1 #work-order/Table lvl 2 #work-order/Table lvl 3 #work-order/Table lvl 4 #work-order","/App/directory-Manager/execution/work-order/Old/Table lvl 1 #work-order/Table lvl 2 #work-order/Table lvl 3 #work-order/Table lvl 4 #work-order/Table lvl 5 materials #work-order","/App/directory-Manager/execution/work-order/Old/UseData #work-order","/App/directory-Manager/execution/work-order/Old/Work order PDF document","/App/directory-Manager/execution/work-order/Table/Cell 10","/App/directory-Manager/execution/work-order/Table/Cell 11","/App/directory-Manager/execution/work-order/Table/Cell 13","/App/directory-Manager/execution/work-order/Table/Cell 2","/App/directory-Manager/execution/work-order/Table/Cell 9","/App/directory-Manager/execution/work-order/Table/SubTable","/App/directory-Manager/execution/work-order/Table/SubTable/Cell 1","/App/Reusable/ClickableTextWithALink","/App/Reusable/Dropdown","/App/Reusable/Dropdown/DropdownItem","/App/Reusable/Dropdown/FilterButtonGroup","/App/Shared/Logic components/conversionOfSectionsIntoATypeOfWork","/App/Shared/Logic components/createUsers","/App/Shared/Logic components/dataConversionWithMaterialSynchronization","/App/Shared/Logic components/function for units","/App/Shared/Logic components/getRootNodeWithAllDocumentWithMaterials","/App/Shared/Logic components/getRootNodeWithAllDocumentWithMaterials/convertDocumentsWithMaterials","/App/Shared/Logic components/switchMountedBackEnvVer","/App/Shared/Logic components/taskDuplicateImagesForEnv","/App/Shared/visual components/Cell 0 Image and Name. for essence materials","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/AnyGrouping/Cell changeds","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/AnyGrouping/Cell value","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/AnyGrouping/Cell withMarkup","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/WorksOrMaterials/Cell changeds","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/WorksOrMaterials/Cell quantity","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/WorksOrMaterials/Cell valueForAllQuantity","/App/Shared/Visual/Cells/Cells with history/ForActsAndProgressRecords/WorksOrMaterials/Cell withMarkupForAllQuantity","/App/Shared/Visual/Cells/Cells with history/NewRK/AnyGrouping/Cell changeds","/App/Shared/Visual/Cells/Cells with history/NewRK/AnyGrouping/Cell discount","/App/Shared/Visual/Cells/Cells with history/NewRK/AnyGrouping/Cell value","/App/Shared/Visual/Cells/Cells with history/NewRK/AnyGrouping/Cell withMarkup","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell changeds","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell discount","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell quantity","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell valueForAllQuantity","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell valuePerOne","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell withMarkupForAllQuantity","/App/Shared/Visual/Cells/Cells with history/NewRK/WorksOrMaterials/Cell withMarkupPerOne","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell changeds","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell discount","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell markup","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell MD","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell MD day","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell MD percent","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell value","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/AnyGrouping/Cell withMarkup","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell changeds","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell markup","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell MD","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell MD day","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell MD percent","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell quantity","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell value per all quantity","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell value per one","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell withMarkup per all quantity","/App/Shared/Visual/Cells/Cells with history/NewRKDataCopyingModel/Works/Cell withMarkup per one","/App/Shared/Visual/Cells/Cells with history/OldRK/AnyGrouping/Cell discount","/App/Shared/Visual/Cells/Cells with history/OldRK/WorksOrMaterials/Cell discount","/App/Shared/Visual/Cells/Cells with history/Works/Cell quantity","/App/Shared/Visual/Cells/Cells with history/Works/Cell value","/App/Shared/Visual/Cells/Common/Cell flowStatusBadge","/App/Shared/Visual/Cells/Common/Cell flowStatusBadgeWithArchived","/App/Shared/Visual/Cells/Common/Cell flowStatusDot","/App/Shared/Visual/Cells/Common/CellAddComment","/App/Shared/Visual/Cells/Common/CellAddComment/AddCommendWithDocument","/App/Shared/Visual/Cells/ProjectGroup/Cell 0 forProjectGroup (Old RK)","/App/Shared/Visual/Cells/ProjectMaterial/Cell 0 forProjectMaterial","/App/Shared/Visual/Cells/ProjectMaterial/Cell 0 forProjectMaterial (Old RK)","/App/Shared/Visual/Cells/ProjectMaterial/Cell 0 forProjectMaterialWithToolTip","/App/Shared/Visual/Cells/ProjectWork/Cell 0 forProjectWork ","/App/Shared/Visual/Cells/ProjectWork/Cell 0 forProjectWorkWithTooltip","/App/Shared/Visual/Cells/ProjectWorkGroup/Cell 0 forProjectWorkGroup","/App/Shared/Visual/Cells/ProjectWorkGroup/Cell 0 forProjectWorkGroupWithTooltip","/App/Shared/Visual/Cells/SectionWithMaterials/Cell 0 forSectionWithMaterials","/App/Shared/Visual/Cells/SectionWithMaterials/Cell 0 forSectionWithMaterialsWithTooltip","/App/Shared/Visual/DropDown","/App/Shared/Visual/Import/Table/SubTable","/App/Shared/Visual/Materials essence management/Delete essence","/App/Shared/Visual/TableWithSectionsFromTheDirectory/SubTable"],"dependencies":[]}},"routerIndex":{"routers":[{"name":"admin","pages":{"routes":["/App/Admin/Subscriptions","/App/Admin/Companies","/App/admin/cabinet","/App/admin/cabinet/users"],"startPage":"/App/admin/cabinet"},"urlPath":"admin","mounted":true},{"pages":{"routes":["/App/CompanyManager/WorkPlanner/State","/App/CompanyManager/WorkPlanner/Planning","/App/admin/cabinet/users"],"startPage":"/App/admin/cabinet/users"},"name":"cabinet"},{"pages":{"routes":["/App/CompanyManager/WorkPlanner","/App/CompanyManager/Houses","/App/CompanyManager/Directory","/App/CompanyManager/Reports","/App/directory-Manager/designing","/App/directory-Manager/execution"],"startPage":"/App/directory-Manager/designing"},"name":"architect","urlPath":"architect","styleCss":"/* background-color: red; */\r\n","clip":"contentHeight","mounted":true},{"pages":{"routes":["/App/CompanyManager/WorkPlanner","/App/CompanyManager/Houses","/App/CompanyManager/Directory","/App/CompanyManager/Reports","/App/directory-Manager/directory","/App/directory-Manager/designing","/App/directory-Manager/execution"],"startPage":"/App/directory-Manager/designing"},"name":"directory-Manager","urlPath":"directory-Manager","styleCss":"/* background-color: red; */\r\nheight: 100%;","clip":"contentHeight","mounted":true},{"pages":{"routes":["/App/CompanyManager/WorkPlanner/State","/App/CompanyManager/WorkPlanner/Planning","/App/directory-Manager/designing/projects","/App/directory-Manager/designing/specification","/App/directory-Manager/designing/equip","/App/directory-Manager/designing/estimate","/App/directory-Manager/execution/schedule","/App/directory-Manager/designing/calculation","/App/directory-Manager/designing/specForms","/App/directory-Manager/designing/order-customer","/App/directory-Manager/designing/order-suplier","/App/directory-Manager/designing/combine","/App/directory-Manager/designing/Все заказы покупателя","/App/directory-Manager/designing/Все заказы поставщика","/App/directory-Manager/designing/Все калькуляции","/App/directory-Manager/designing/Все заказ наряды","/App/directory-Manager/designing/График"],"startPage":"/App/directory-Manager/designing/projects"},"name":"designing"},{"pages":{"routes":["/App/CompanyManager/WorkPlanner/State","/App/CompanyManager/WorkPlanner/Planning","/App/directory-Manager/directory/works","/App/directory-Manager/directory/materials","/App/directory-Manager/directory/brigades"],"startPage":"/App/directory-Manager/directory/works"},"name":"directory"},{"pages":{"routes":["/App/CompanyManager/WorkPlanner/State","/App/CompanyManager/WorkPlanner/Planning","/App/directory-Manager/execution/all-projects","/App/directory-Manager/execution/estimate","/App/directory-Manager/execution/work-order","/App/directory-Manager/execution/all-work-orders","/App/directory-Manager/execution/schedule","/App/directory-Manager/execution/payments","/App/directory-Manager/execution/journal of all work orders","/App/directory-Manager/execution/Журнал всех заказ нарядов","/App/directory-Manager/execution/Журнал всех калькуляций","/App/directory-Manager/execution/Журнал производства работ"],"startPage":"/App/directory-Manager/execution/all-projects"},"name":"execution"},{"name":"schedule","pages":{"routes":["/App/directory-Manager/execution/schedule/tabelSchedule","/App/directory-Manager/execution/schedule/graphGantt","/App/directory-Manager/execution/schedule/graphGantt","/App/directory-Manager/execution/schedule/tabelGantt"],"startPage":"/App/directory-Manager/execution/schedule/tabelSchedule"}}],"pages":[{"path":"cabinet","title":"cabinet","component":"/App/admin/cabinet"},{"path":"users","title":"users","component":"/App/admin/cabinet/users"},{"path":"designing","title":"designing","component":"/App/directory-Manager/designing"},{"path":"all-work-orders","title":"Все заказ наряды","component":"/App/directory-Manager/designing/Все заказ наряды"},{"path":"all-customer-order","title":"Все заказы покупателя","component":"/App/directory-Manager/designing/Все заказы покупателя"},{"path":"all-suplier-order","title":"Все заказы поставщика","component":"/App/directory-Manager/designing/Все заказы поставщика"},{"path":"aii-calculations","title":"Все калькуляции","component":"/App/directory-Manager/designing/Все калькуляции"},{"path":"work-schedule/{currentProjectId}","title":"График","component":"/App/directory-Manager/designing/График"},{"path":"calculation/{currentProjectId}","title":"calculation","component":"/App/directory-Manager/designing/calculation"},{"path":"combine/{currentProjectId}","title":"combine","component":"/App/directory-Manager/designing/combine"},{"path":"estimate/{currentProjectId}","title":"estimate","component":"/App/directory-Manager/designing/estimate"},{"path":"order-customer/{currentProjectId}","title":"order-customer","component":"/App/directory-Manager/designing/order-customer"},{"path":"order-suplier/{currentProjectId}","title":"order-suplier","component":"/App/directory-Manager/designing/order-suplier"},{"path":"projects","title":"projects","component":"/App/directory-Manager/designing/projects"},{"path":"specforms/{currentProjectId}","title":"specForms","component":"/App/directory-Manager/designing/specForms"},{"path":"specification/{currentProjectId}","title":"specification","component":"/App/directory-Manager/designing/specification"},{"path":"directory","title":"directory","component":"/App/directory-Manager/directory"},{"path":"brigades","title":"brigades","component":"/App/directory-Manager/directory/brigades"},{"path":"materials","title":"materials","component":"/App/directory-Manager/directory/materials"},{"path":"works","title":"works","component":"/App/directory-Manager/directory/works"},{"path":"execution","title":"execution","component":"/App/directory-Manager/execution"},{"path":"journal-all-work-orders","title":"Журнал всех заказ нарядов","component":"/App/directory-Manager/execution/Журнал всех заказ нарядов"},{"path":"journal-of-all-calculation","title":"Журнал всех калькуляций","component":"/App/directory-Manager/execution/Журнал всех калькуляций"},{"path":"work-progress-journal","title":"Журнал производства работ","component":"/App/directory-Manager/execution/Журнал производства работ"},{"path":"all-projects","title":"all-projects","component":"/App/directory-Manager/execution/all-projects"},{"path":"all-work-orders","title":"all-work-orders","component":"/App/directory-Manager/execution/all-work-orders"},{"path":"estimate/{currentProjectId}","title":"estimate","component":"/App/directory-Manager/execution/estimate"},{"path":"journal-of-all-work-orders","title":"journal of all work orders","component":"/App/directory-Manager/execution/journal of all work orders"},{"path":"payments","title":"payments","component":"/App/directory-Manager/execution/payments"},{"path":"schedule/{currentProjectId}","title":"schedule","component":"/App/directory-Manager/execution/schedule"},{"path":"graphgantt","title":"graphGantt","component":"/App/directory-Manager/execution/schedule/graphGantt"},{"path":"tabelschedule","title":"tabelSchedule","component":"/App/directory-Manager/execution/schedule/tabelSchedule"},{"path":"work-order/{currentProjectId}","title":"work-order","component":"/App/directory-Manager/execution/work-order"}]},"rootComponent":"/App","rootNode":"3b1fc3c7-9f74-6528-00cb-c633566ec754","metadata":{"styles":{"text":{"Display":{"letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none","fontSize":{"value":"40","unit":"px"},"fontFamily":"fonts/Roboto/Roboto-Regular.ttf","color":"#000000"},"Headline":{"fontFamily":"fonts/Roboto/Roboto-Regular.ttf","fontSize":{"value":"32","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none"},"Title Large":{"fontFamily":"fonts/Roboto/Roboto-Bold.ttf","fontSize":{"value":"24","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120%","unit":"px"},"textTransform":"none"},"Title Medium":{"fontFamily":"fonts/Roboto/Roboto-Medium.ttf","fontSize":{"value":"20","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none"},"Title Small":{"fontFamily":"fonts/Roboto/Roboto-Bold.ttf","fontSize":{"value":"16","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none"},"Label Large":{"fontFamily":"fonts/Roboto/Roboto-Medium.ttf","fontSize":{"value":"16","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none"},"Label Medium":{"fontFamily":"fonts/Roboto/Roboto-Medium.ttf","fontSize":{"value":"14","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none"},"Label Small":{"fontFamily":"fonts/Roboto/Roboto-Medium.ttf","fontSize":{"value":"12","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"120","unit":"%"},"textTransform":"none"},"Body Large":{"fontFamily":"fonts/Roboto/Roboto-Regular.ttf","fontSize":{"value":"20","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"150","unit":"%"},"textTransform":"none"},"Body Medium":{"fontFamily":"fonts/Roboto/Roboto-Regular.ttf","fontSize":{"value":"16","unit":"px"},"color":"#000000","letterSpacing":"Auto","lineHeight":{"value":"150","unit":"%"},"textTransform":"none"},"Body Small":{"letterSpacing":"Auto","lineHeight":{"value":"150","unit":"%"},"textTransform":"none","fontFamily":"fonts/Roboto/Roboto-Regular.ttf","fontSize":{"value":"14","unit":"px"},"color":"#000000"}},"colors":{"Primary":"#5836F5","Primary Dark":"#3F22B8","Primary Subtle":"#C9BFFC","Primary Light":"#F7F5FF","Grey - 900":"#1F1F1F","Grey - 800":"#383838","Grey - 700":"#4C4C4C","Grey - 600":"#757575","Grey - 500":"#A5A5A5","Grey - 400":"#CECECE","Grey - 300":"#E9E9E9","Grey - 200":"#F4F4F4","Grey - 100":"#FBFBFB","Success":"#49AD7F","Notice":"#F2C441","Danger":"#F75A4F","White":"#FFFFFF","Black":"#000000"}},"cloudservices":{"instanceId":"5cb7df5f0651b5e8","workspaceId":"2mq71c","endpoint":"https://backend.noodl.cloud/2mq71c/5cb7df5f0651b5e8","appId":"5cb7df5f0651b5e8"}},"variants":[{"typename":"Text","parameters":{"textStyle":"Body Medium"},"stateParameters":{},"stateTransitions":{}},{"typename":"net.noodl.controls.button","parameters":{"height":{"value":40,"unit":"px"},"sizeMode":"contentWidth","backgroundColor":"Primary","iconIconSource":{"class":"material-icons","code":"home"},"iconSpacing":{"value":8,"unit":"px"},"borderRadius":{"value":4,"unit":"px"},"textStyle":"Label Medium","paddingTop":{"value":0,"unit":"px"},"paddingLeft":{"value":24,"unit":"px"},"paddingRight":{"value":24,"unit":"px"},"paddingBottom":{"value":0,"unit":"px"},"color":"#FFFFFF","minWidth":{"value":80,"unit":"px"},"useIcon":false,"iconSize":{"value":20,"unit":"px"}},"stateParameters":{"hover":{"backgroundColor":"Primary Dark"},"pressed":{"backgroundColor":"Primary","color":"White"},"disabled":{"backgroundColor":"Grey - 300","color":"Grey - 600"}},"stateTransitions":{},"defaultStateTransitions":{"neutral":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"hover":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"pressed":{"curve":[0,0,0.58,1],"dur":0,"delay":0}}},{"typename":"net.noodl.controls.textinput","parameters":{"useLabel":true,"sizeMode":"explicit","height":{"value":40,"unit":"px"},"textStyle":"Body Medium","borderStyle":"solid","borderRadius":{"value":4,"unit":"px"},"borderWidth":{"value":1,"unit":"px"},"borderColor":"Grey - 700","labeltextStyle":"Label Small","paddingLeft":{"value":12,"unit":"px"},"paddingRight":{"value":8,"unit":"px"},"labelSpacing":{"value":4,"unit":"px"},"placeholder":"Type here","color":"Grey - 900","placeHolderOpacity":0.65,"enabled":true,"blockTouch":false,"useIcon":false,"iconIconSource":{"class":"material-icons","code":"home"},"iconSize":{"value":20,"unit":"px"},"iconSpacing":{"value":4,"unit":"px"},"iconColor":"Grey - 700","labelcolor":"Grey - 700"},"stateParameters":{"hover":{"labelcolor":"Grey - 700","borderColor":"Grey - 700","borderStyle":"solid","color":"Grey - 900"},"focused":{"borderColor":"Primary","labelcolor":"Primary","borderWidth":{"value":1,"unit":"px"},"boxShadowEnabled":false,"boxShadowColor":"Primary","borderStyle":"solid"},"disabled":{"labelcolor":"Grey - 500","backgroundColor":"Grey - 200","borderWidth":{"value":1,"unit":"px"},"borderColor":"Grey - 500","color":"Grey - 600"}},"stateTransitions":{},"defaultStateTransitions":{"neutral":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"focused":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"hover":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"disabled":{"curve":[0,0,0.58,1],"dur":0,"delay":0}}},{"typename":"net.noodl.controls.options","parameters":{"sizeMode":"explicit","height":{"value":40,"unit":"px"},"borderWidth":{"value":1,"unit":"px"},"borderRadius":{"value":4,"unit":"px"},"borderColor":"Grey - 700","boxShadowColor":"Dark Gray","useIcon":true,"iconIconSource":{"class":"material-icons","code":"expand_more"},"iconPlacement":"right","iconSize":{"value":20,"unit":"px"},"paddingRight":{"value":12,"unit":"px"},"textStyle":"Body Medium","paddingLeft":{"value":12,"unit":"px"},"marginTop":{"value":0,"unit":"px"},"width":{"value":100,"unit":"%"},"iconColor":"Grey - 700","placeholderOpacity":0.65,"placeholder":"Select option","useLabel":true,"labelSpacing":{"value":4,"unit":"px"},"labeltextStyle":"Label Small","labelcolor":"Grey - 700","items":"[\n {\"Label\":\"Option 1\", \"Value\":\"1\"},\n {\"Label\":\"Option 2\", \"Value\":\"2\"},\n {\"Label\":\"Option 3\", \"Value\":\"3\"}\n]"},"stateParameters":{"hover":{"borderColor":"Grey - 700","borderRadius":{"value":4,"unit":"px"},"iconColor":"Grey - 900","iconSize":{"value":20,"unit":"px"},"iconPlacement":"right","color":"Grey - 900","labelcolor":"Grey - 700"},"focused":{"borderColor":"Primary","boxShadowColor":"Primary","borderRadius":{"value":4,"unit":"px"},"useIcon":true,"iconColor":"Primary","iconIconSource":{"class":"material-icons","code":"keyboard_arrow_up"},"iconPlacement":"right","color":"Grey - 900","labelcolor":"Primary"},"pressed":{"borderRadius":{"value":4,"unit":"px"}},"disabled":{"labelcolor":"Grey - 500","iconColor":"Grey - 500","borderColor":"Grey - 500","color":"Grey - 600","backgroundColor":"Grey - 200"}},"stateTransitions":{},"defaultStateTransitions":{"neutral":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"focused":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"hover":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"pressed":{"curve":[0,0,0.58,1],"dur":0,"delay":0}}},{"typename":"net.noodl.controls.range","parameters":{"thumbColor":"Primary","thumbBorderRadius":{"value":100,"unit":"%"},"trackHeight":{"value":4,"unit":"px"},"trackActiveColor":"Primary","trackColor":"Primary Subtle","width":{"value":100,"unit":"%"},"trackBorderRadius":{"value":100,"unit":"px"},"thumbHeight":{"value":16,"unit":"px"},"thumbWidth":{"value":16,"unit":"px"}},"stateParameters":{"hover":{"thumbColor":"Primary Dark","trackActiveColor":"Primary Dark"},"disabled":{"trackActiveColor":"Grey - 500","trackColor":"Grey - 300","thumbColor":"Grey - 500"}},"stateTransitions":{}},{"typename":"net.noodl.controls.checkbox","parameters":{"width":{"value":20,"unit":"px"},"height":{"value":20,"unit":"px"},"useIcon":false,"borderWidth":{"value":1,"unit":"px"},"useLabel":true,"labeltextStyle":"Body Medium","borderRadius":{"value":2,"unit":"px"},"borderColor":"Grey - 700","labelfontSize":{"value":16,"unit":"px"},"labelcolor":"Grey - 900","labelSpacing":{"value":12,"unit":"px"}},"stateParameters":{"checked":{"useIcon":true,"iconIconSource":{"class":"material-icons","code":"check"},"backgroundColor":"Primary","borderColor":"Primary","iconSize":{"value":16,"unit":"px"}},"disabled":{"opacity":0.5},"hover":{"borderColor":"Grey - 700"},"pressed":{}},"stateTransitions":{},"defaultStateTransitions":{"neutral":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"hover":{"curve":[0,0,0.58,1],"dur":300,"delay":0},"checked":{"curve":[0,0,0.58,1],"dur":0,"delay":0}}},{"typename":"net.noodl.controls.radiobutton","parameters":{"width":{"value":20,"unit":"px"},"height":{"value":20,"unit":"px"},"useLabel":true,"labeltextStyle":"Body Large","borderWidth":{"value":1,"unit":"px"},"value":"0","useIcon":false,"fillColor":"transparent","borderColor":"Grey - 700","labelfontSize":{"value":16,"unit":"px"},"marginBottom":{"value":8,"unit":"px"},"labelcolor":"Grey - 900","labelSpacing":{"value":12,"unit":"px"}},"stateParameters":{"checked":{"fillColor":"Primary","borderColor":"Primary","borderWidth":{"value":1,"unit":"px"},"backgroundColor":"transparent","width":{"value":20,"unit":"px"},"height":{"value":20,"unit":"px"},"fillSpacing":{"value":2,"unit":"px"}},"hover":{"backgroundColor":"transparent","borderColor":"Grey - 700","width":{"value":20,"unit":"px"},"height":{"value":20,"unit":"px"}},"disabled":{"borderColor":"Grey - 500","labelcolor":"Grey - 500","fillColor":"transparent"}},"stateTransitions":{},"defaultStateTransitions":{"neutral":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"hover":{"curve":[0,0,0.58,1],"dur":0,"delay":0},"checked":{"curve":[0,0,0.58,1],"dur":0,"delay":0}}}]};