krona-front/design/penpot/generate-module-screens.mjs

41 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const out = path.dirname(fileURLToPath(import.meta.url));
const esc = (s) => String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
const modules = [
['41-crm-deal','CRM · Карточка сделки','Сделка «Поставка упаковки»','Сумма|180 000 ₽;Вероятность|40%;Этап|Квалификация;Следующее действие|Сегодня, 15:00','Контакт|Иван Петров|Директор · ООО «Ресурс»;Телефон|+7 900 123-45-67|Telegram подключён;Задачи|Подготовить предложение|Сегодня, 15:00;Документы|Коммерческое предложение|Черновик;История|Входящий запрос с сайта|18 сентября, 12:41'],
['42-crm-contacts','CRM · Контакты','Контакты','Всего|128;Активные|94;Без сделки|21;Новые за месяц|17','Иван Петров|ООО «Ресурс»|+7 900 123-45-67;Анна Белова|Сеть кофеен «Маяк»|anna@mayak.ru;Сергей Орлов|БЦ «Север»|Telegram;Мария Волкова|Отель «Гранд»|+7 913 555-22-11;Александр Ким|IT Park|alex@itpark.ru'],
['43-crm-companies','CRM · Компании','Компании','Всего|42;С активными сделками|18;Клиенты|29;Поставщики|13','ООО «Ресурс»|Поставщик|3 сделки · 1,2 млн ₽;Сеть кофеен «Маяк»|Клиент|2 сделки · 680 000 ₽;БЦ «Север»|Клиент|1 сделка · 240 000 ₽;Отель «Гранд»|Клиент|4 сделки · 2,6 млн ₽;IT Park|Партнёр|2 сделки · 920 000 ₽'],
['44-crm-leads','CRM · Лиды','Лиды','Новые|17;В работе|9;Конверсия|34%;Без ответа|3','Заявка на корпоративное питание|Сайт|Сегодня, 12:41;Кейтеринг на 120 человек|Telegram|Сегодня, 11:18;Поставка обедов в офис|Email|Вчера, 17:30;Франшиза кафе|MAX|Вчера, 15:06;Банкет на октябрь|Телефон|17 сентября'],
['50-sales','Продажи','Заказы и продажи','Выручка сегодня|184 600 ₽;Заказов|47;Средний чек|3 928 ₽;К оплате|62 400 ₽','№ 1048|Доставка · Новый|4 860 ₽;№ 1047|Зал · Готовится|2 340 ₽;№ 1046|Самовывоз · Готов|1 780 ₽;№ 1045|Доставка · В пути|6 120 ₽;№ 1044|Зал · Закрыт|3 560 ₽'],
['51-inventory','Склад','Остатки и движение','Позиций|386;Ниже минимума|12;На сумму|2,84 млн ₽;Списания сегодня|8 420 ₽','Лосось охлаждённый|4,2 кг|Ниже минимума;Сливки 33%|18 л|Достаточно;Сыр моцарелла|12,5 кг|Заказать;Бутылка 0,5 л|240 шт|Достаточно;Кофе зерно|7 кг|Резерв 2 кг'],
['52-procurement','Закупки','Заявки поставщикам','К заказу|184 300 ₽;Поставщиков|8;Не достигнут минимум|2;Ближайшая доставка|Завтра','ООО «Ресурс»|42 600 ₽|Минимум 15 000 ₽;ФудСервис|68 400 ₽|Лучшие цены: 14 позиций;Рыбный двор|12 800 ₽|До минимума 2 200 ₽;Упаковка Про|34 500 ₽|Доставка во вторник;Магазин · ежедневный закуп|26 000 ₽|18 позиций'],
['53-finance','Финансы','Деньги и платежи','Доступно|1,84 млн ₽;К поступлению|620 000 ₽;К оплате|438 000 ₽;ДДС к учёту|72 400 ₽','Поступление · ООО «Альфа»|+180 000 ₽|Сегодня, 10:21;Оплата · ФудСервис|−68 400 ₽|Сегодня, 09:40;Зарплата · аванс|−320 000 ₽|20 сентября;Аренда|−185 000 ₽|25 сентября;Поступление · БЦ «Север»|+240 000 ₽|28 сентября'],
['54-staff','Сотрудники','Команда и смены','Сотрудников|48;Сегодня в смене|31;Опаздывают|2;ФОТ месяца|2,16 млн ₽','Горский 1/1 · Зал|12 сотрудников|Смена открыта;Горский 1/1 · Кухня|9 сотрудников|1 опоздание;Доставка|7 сотрудников|Все на линии;Офис|3 сотрудника|Рабочий день;Резерв|5 сотрудников|Доступны'],
['55-projects','Проекты','Проекты','Активные|8;В срок|6;С риском|2;Бюджет|4,8 млн ₽','Открытие летней веранды|68%|До 30 сентября;Новая система лояльности|42%|До 15 октября;Переезд склада|81%|Риск срока;Меню осень 2026|93%|На согласовании;Автоматизация закупок|35%|До 1 ноября'],
['56-tasks','Задачи','Задачи команды','Сегодня|18;Просрочено|4;На проверке|7;Выполнено за неделю|96','Согласовать заявку поставщику|Высокий|Сегодня, 13:00;Проверить остатки лосося|Высокий|Сегодня, 14:00;Обновить график смен|Обычный|Сегодня, 17:00;Подготовить договор|Обычный|Завтра;Проверить рекламную кампанию|Низкий|21 сентября'],
['57-marketing','Маркетинг','Кампании и аудитории','Расход месяца|284 000 ₽;Лиды|318;Цена лида|893 ₽;ROMI|184%','Осеннее меню · VK|Активна|86 лидов · 72 000 ₽;Бизнес-ланчи · Яндекс|Активна|142 лида · 118 000 ₽;Доставка · Telegram|Пауза|38 лидов · 31 000 ₽;Банкеты · Email|Запланирована|Старт 22 сентября;Возврат гостей · SMS|Активна|52 лида · 63 000 ₽'],
['58-analytics','Аналитика','Показатели бизнеса','Выручка|4,82 млн ₽;Прибыль|1,14 млн ₽;Средний чек|3 640 ₽;Повторные гости|42%','Выручка по дням|Пн 620 · Вт 710 · Ср 680 · Чт 760|Рост 12%;Каналы продаж|Зал 48% · Доставка 37% · Самовывоз 15%|;Лучшие категории|Бизнес-ланчи · Напитки · Банкеты|;Загрузка команды|82%|Пик 13:00–15:00;Прогноз месяца|6,4 млн ₽|Выполнение 75%'],
['59-documents','Документы','Документы','На подпись|7;Черновики|14;Истекают|3;Всего|486','Договор поставки №42|На подпись|ООО «Ресурс»;Счёт №1048|Оплачен|ООО «Альфа»;Сертификат на лосось|Истекает через 8 дней|Рыбный двор;Акт сверки|Черновик|ФудСервис;Трудовой договор|Подписан|Иванов А. В.'],
['60-automation','Автоматизация','Сценарии','Активные|18;Запусков сегодня|426;Ошибки|2;Сэкономлено|37 ч','Низкий остаток → заявка|Активен|86 запусков;Новый лид → задача менеджеру|Активен|42 запуска;Заказ готов → сообщение клиенту|Активен|214 запусков;Просрочка оплаты → напоминание|Ошибка|2 запуска;Смена закрыта → отчёт|Активен|82 запуска'],
['61-sites','Сайты','Сайты и формы','Опубликовано|3;Черновики|2;Заявок за неделю|74;Конверсия|6,8%','krona.restaurant|Опубликован|Основной сайт;delivery.krona.restaurant|Опубликован|Доставка;banket.krona.restaurant|Опубликован|Банкеты;Осеннее меню|Черновик|Лендинг;Вакансии|Черновик|Форма отклика'],
['62-support','Поддержка','Обращения','Открыто|12;Критичные|2;Среднее время ответа|8 мин;Решено сегодня|34','Не проходит оплата|Критичный|Организация «Альфа»;Не загружается прайс|Высокий|ООО «Ресурс»;Добавить пользователя|Обычный|Ресторан «Маяк»;Ошибка отчёта|Высокий|Горский 1/1;Вопрос по тарифу|Низкий|Кафе «Берег»'],
['65-ai-center','ИИ-центр','ИИ-центр','Ассистенты|8;Автоматизаций|24;Диалогов сегодня|186;Экономия времени|46 ч','Помощник руководителя|Активен|Сводки и решения;Ассистент закупок|Активен|Сравнение поставщиков;Контроль качества|Активен|12 проверок сегодня;HR-помощник|Обучается|База знаний 82%;Маркетолог|Активен|4 кампании'],
['66-apps','Приложения','Приложения и интеграции','Установлено|14;Доступно|32;Требуют внимания|2;Синхронизаций сегодня|1 284','Коммуникации|Установлено|Telegram · MAX · WhatsApp;Сотрудники|Установлено|Мобильное приложение;Закупки|Установлено|8 поставщиков;Google Drive|Подключено|Последняя синхронизация 5 мин;Яндекс Диск|Требует входа|Резервные копии'],
['67-entity-builder','Конструктор сущностей','Конструктор сущностей','Сущностей|18;Пользовательских полей|74;Связей|31;Изменений сегодня|6','Клиент|12 полей|CRM · Продажи;Сырьё|18 полей|Склад · Закупки;Поставщик|14 полей|Закупки · Документы;Сотрудник|16 полей|Сотрудники · Задачи;Сертификат|8 полей|Склад · Документы'],
['63-settings','Настройки','Настройки организации','Организация|ООО «Крона»;Пользователи|48;Подключённые модули|12;Роль владельца|Полный доступ','Профиль организации|Реквизиты и бренд|Настроено;Пользователи и роли|48 пользователей|3 приглашения;Модули|12 включено|Каналы скрыты;Интеграции и VPN|6 подключений|VPN активен;Резервные копии|Ежедневно, 03:00|Последняя успешна'],
['64-home','Главная','Рабочий день','Выручка сегодня|184 600 ₽;Задачи|18;Новые сообщения|48;Требует внимания|7','Продажи|47 заказов|+12% к прошлой субботе;Закупки|2 поставщика ниже минимума|Нужно решение;Сотрудники|31 в смене|2 опоздания;Коммуникации|48 непрочитанных|12 Telegram;Финансы|438 000 ₽ к оплате|До 25 сентября']
];
const nav=['Главная','Аналитика','Маркетинг','Коммуникации','CRM','Продажи','Склад','Закупки','Финансы','Сотрудники','Проекты','Задачи','Документы','Автоматизация','Сайты','Поддержка','Настройки'];
function make([_slug,module,title,statsRaw,rowsRaw]){
const stats=statsRaw.split(';').map(x=>x.split('|')), rows=rowsRaw.split(';').map(x=>x.split('|'));
const navSvg=nav.map((n,i)=>`<g transform="translate(22 ${112+i*43})"><rect x="-10" y="-25" width="194" height="36" rx="8" fill="${module.startsWith(n)||title.startsWith(n)?'#486B55':'transparent'}"/><circle cx="6" cy="-7" r="6" fill="${module.startsWith(n)||title.startsWith(n)?'#E8C47A':'#829286'}"/><text x="22" y="-2" font-size="12" fill="#F7F0DF">${esc(n)}</text></g>`).join('');
const statSvg=stats.map((s,i)=>`<g transform="translate(${258+i*300} 190)"><text y="0" font-size="11" fill="#77756C">${esc(s[0])}</text><text y="32" font-size="22" font-weight="700" fill="#23332A">${esc(s[1])}</text><line y1="50" x2="268" y2="50" stroke="#D8CDB7"/></g>`).join('');
const rowsSvg=rows.map((r,i)=>`<g transform="translate(270 ${394+i*92})"><circle cx="20" cy="22" r="18" fill="${i===0?'#DDE9DA':'#EEE6D6'}"/><text x="54" y="14" font-size="15" font-weight="700" fill="#242B27">${esc(r[0])}</text><text x="54" y="39" font-size="12" fill="#6F7069">${esc(r[1]||'')}</text><text x="1040" y="25" text-anchor="end" font-size="12" fill="${/ошиб|ниже|крит|проср|риск/i.test(r[2]||'')?'#A44E3F':'#486B55'}">${esc(r[2]||'')}</text><path d="M1070 18l8 8-8 8" fill="none" stroke="#A8752F" stroke-width="2"/><line x1="0" y1="68" x2="1100" y2="68" stroke="#E3DAC8"/></g>`).join('');
return `<svg xmlns="http://www.w3.org/2000/svg" width="1536" height="1024" viewBox="0 0 1536 1024"><rect width="1536" height="1024" fill="#F7F1E5"/><rect width="220" height="1024" fill="#20352A"/><text x="28" y="42" font-family="Georgia" font-size="25" font-weight="700" fill="#E8C47A">♛ KRONA</text><text x="29" y="62" font-family="Arial" font-size="9" fill="#DCC58F">БИЗНЕС-ПЛАТФОРМА</text>${navSvg}<rect x="220" width="1316" height="72" fill="#FCF8EF" stroke="#DED3BF"/><rect x="248" y="16" width="210" height="40" rx="10" fill="#F5EEDC" stroke="#D8CDB7"/><text x="266" y="41" font-family="Arial" font-size="12" fill="#3A443D">Ресторан: Зал + Доставка⌄</text><rect x="810" y="16" width="360" height="40" rx="10" fill="#FCF8EF" stroke="#D8CDB7"/><text x="834" y="41" font-family="Arial" font-size="12" fill="#8A887F">⌕ Поиск по платформе…</text><circle cx="1450" cy="36" r="18" fill="#DDE9DA"/><text x="1400" y="40" text-anchor="end" font-family="Arial" font-size="12" fill="#36443A">Виктор</text><text x="256" y="126" font-family="Georgia" font-size="30" font-weight="700" fill="#26382E">${esc(title)}</text><text x="256" y="153" font-family="Arial" font-size="12" fill="#77756C">${esc(module)} · рабочий экран</text><rect x="1324" y="105" width="170" height="42" rx="10" fill="#35684B"/><text x="1409" y="132" text-anchor="middle" font-family="Arial" font-size="13" font-weight="700" fill="#FFF9EC">+ Создать</text>${statSvg}<rect x="250" y="270" width="1248" height="64" rx="12" fill="#FCF8EF" stroke="#DED3BF"/><text x="278" y="309" font-family="Arial" font-size="13" fill="#8A887F">⌕ Поиск и фильтры</text><rect x="1296" y="282" width="174" height="40" rx="9" fill="#F5EEDC"/><text x="1383" y="307" text-anchor="middle" font-family="Arial" font-size="12" fill="#4D554F">Фильтры · Период</text><text x="270" y="370" font-family="Arial" font-size="11" font-weight="700" fill="#77756C">НАЗВАНИЕ</text><text x="1310" y="370" text-anchor="end" font-family="Arial" font-size="11" font-weight="700" fill="#77756C">СТАТУС / ДЕТАЛИ</text>${rowsSvg}<rect x="1188" y="890" width="282" height="80" rx="14" fill="#EEF3EA" stroke="#C9D8C9"/><text x="1210" y="919" font-family="Arial" font-size="11" fill="#6C786D">KRONA AI</text><text x="1210" y="943" font-family="Arial" font-size="13" fill="#294B38">Сводка и следующее действие →</text></svg>`;
}
for (const item of modules) fs.writeFileSync(path.join(out,`${item[0]}.svg`),make(item),'utf8');
console.log(`generated ${modules.length} screens`);