CATERIUM · v17.6.0

v17.6.0 · STABILITY & SECURITY
- Зафиксирована отдельная rollback-сборка v17.5.31.
- Закрыт stored DOM-XSS в старом bootstrap; общий безопасный вывод вынесен в core/sun-safe.js.
- Старый bootstrap вынесен из index.html в legacy/bootstrap.js, динамические DOM-вставки защищены от insertBefore/NotFoundError.
- Production Edge Function caterium-create-employee возвращена в исходники проекта; секреты остаются только в окружении Supabase.
- Убран блокирующий offer-gallery-data.js; оставлены только реально используемые 001.jpg и 002.jpg, неключевые изображения грузятся лениво.
- PDF-упаковка сведена в один A4-движок; Light / Editorial Grid / Midnight Glass / Emerald Gold и PDF-каталог повторно проверены визуально.
- На мобильной ширине 390 px устранён document-level горизонтальный overflow; горизонтальные ленты прокручиваются внутри своих областей.
- Добавлены автоматические syntax/security/release checks и E2E-спецификация для следующих релизов.

v17.5.31 · СТАБИЛЬНАЯ НАВИГАЦИЯ ЧАТОВ
- Исправлена ошибка insertBefore при добавлении чата в сгруппированное левое меню.
- «Чат» — отдельный пункт бокового меню со счётчиком непрочитанных.
- Внутри: Общий / Личные / Заказы.
- Чат заказа открывается внутри самого заказа отдельной вкладкой «Чат».
- Та же переписка доступна из «Чат → Заказы».
- Серверная схема чата v29 и RLS не менялись.

v17.5.30 · ПРАВА АДМИНИСТРАТОРОВ
- У роли «Администратор» теперь можно индивидуально включать и отключать функции.
- Явные права сотрудника имеют приоритет над шаблоном роли и на сервере, и в интерфейсе.
- Проверка «последний активный администратор» считает других активных администраторов, а не блокирует второго администратора.
- Нельзя оставить компанию без активного администратора или без администратора с правом «Пользователи и права».
- Серверные изменения: SUPABASE-ADMIN-RIGHTS-V30.sql.

РЕГИСТРАЦИЯ
- Регистрация: название компании, email, пароль, подтверждение пароля.
- Подтверждение email по ссылке не требуется.
- После регистрации Caterium автоматически входит в аккаунт и создаёт компанию.

ПОЛЬЗОВАТЕЛИ И ПРАВА
1. Настройки → Аккаунт → Пользователи и права.
2. Нажмите «+ Добавить сотрудника».
3. Укажите имя, email и роль.
4. Новый аккаунт создаётся сразу и получает временный пароль; существующий аккаунт просто добавляется в компанию.
5. При первом входе по временному паролю сотрудник задаёт новый пароль.

ЧАТЫ
- «Чаты» в основной навигации: общий чат компании и личные диалоги сотрудников.
- В сохранённых заказах есть «Обсуждение», а в карточках заказов — кнопка «Чат».
- Есть непрочитанные, прочтение, «печатает…» и онлайн-статус.
- Можно отправлять фото и файлы: до 5 за сообщение, до 15 МБ каждый.
- Личные чаты серверно доступны только двум участникам; данные разных компаний изолированы.
- Вложения хранятся в приватном Supabase Storage bucket sun-chat.

ДЛЯ ТЕКУЩЕГО SUPABASE
- SUPABASE-CHAT-V29.sql уже применён. Для нового проекта выполняйте его после базовых/SaaS/RBAC миграций.

Сборка v17.5.21.

Главное изменение: Настройки разделены на 6 вкладок — Аккаунт, Оформление, Предложение, Заказы, Справочники и Документы. На мобильных вкладки прокручиваются горизонтально, последняя открытая вкладка запоминается. Резервное копирование и блок стабильности остаются скрыты из обычных Настроек.


Что изменено в v17.5.19:
- Исправлен выход из аккаунта: кнопки «Выйти» теперь завершают локальную сессию Supabase без зависания на сетевой синхронизации, с аварийным локальным сбросом токена текущего проекта.
- При выходе текущая локальная копия компании сохраняется отдельно; разделение данных аккаунтов из v17.5.18 сохранено.
- Обновлён PWA-кэш, чтобы браузер не оставался на старом обработчике выхода.

Что было добавлено в v17.5.18:
- рабочие данные теперь изолируются по облачной компании/workspace на одном устройстве;
- при смене аккаунта локальная копия предыдущей компании сохраняется отдельно в IndexedDB и очищается перед загрузкой другой компании;
- новая компания стартует без заказов, клиентов, финансов, склада и прочих рабочих данных, но с текущим каталогом из 113 позиций;
- фотографии каталога оптимизированы без смены формата (JPEG), чтобы уменьшить размер дистрибутива;
- старый статический PDF-каталог удалён из архива: актуальный PDF формируется по текущим данным приложения через кнопку «Скачать PDF».

Структура релиза сохранена без изменения облачной архитектуры: браузерные модули объединены в app-runtime.js, мобильный CSS встроен в index.html. Фотографии боксов хранятся обычными JPG в папке catalog: legacy-каталог 001.jpg–060.jpg находится там полностью, а актуальный каталог использует current-001.jpg–current-113.jpg. Перед первым запуском start-mobile-server.bat выполняет prepare-catalog-photos.js: он проверяет все 113 актуальных фотографий, один раз докачивает отсутствующие по исходным ссылкам сайта и только после полного результата запускает server.js. Во время обычной работы server.js больше не загружает фотографии с Tilda/CDN — каталог и PDF используют локальные файлы. После успешной первой подготовки интернет для фотографий каталога не нужен. Финальная фотогалерея предложения хранится отдельными JPEG в папке offer-gallery; преобразование изображений для PDF выполняется только после нажатия «Скачать PDF».

Файлы .sun-sync-secret, sun-sync-data.json и PHONE-LINK.txt намеренно не входят в чистый релиз: server.js создаёт их автоматически при первом запуске. Это не удаляет пользовательские данные из уже работающей установленной папки — при обновлении поверх существующей папки её текущие файлы данных нужно сохранить.

ВАЖНО ДЛЯ ПЕРВОГО ЗАПУСКА: если в архиве ещё нет всех current-001.jpg–current-113.jpg, компьютер должен быть подключён к интернету. Уже скачанные файлы сохраняются, поэтому при обрыве достаточно снова запустить start-mobile-server.bat. Отдельно повторить подготовку можно файлом DOWNLOAD-ALL-CATALOG-PHOTOS.bat.

Ниже объединены прежние инструкции проекта, чтобы в папке не было множества отдельных README-файлов.


==============================================================================
РАЗДЕЛ ИЗ ADMIN-ACCESS.txt
==============================================================================
СОЛНЦЕ КЕЙТЕРИНГ — АККАУНТЫ И ПРАВА (Cloud RBAC)

ГЛАВНЫЙ АДМИНИСТРАТОР
Email: dpavlov346@bk.ru
Роль: Администратор
Рабочая база: Солнце Кейтеринг
Пароль в архиве не хранится.

КАК ВОЙТИ
1. Откройте приложение.
2. На экране «Вход в Солнце Кейтеринг» введите email и пароль облачного аккаунта.
3. После входа рабочая база «Солнце Кейтеринг» выбирается автоматически.
4. Быстрый PIN можно включить в Настройки -> Аккаунт. PIN работает только на этом устройстве.

КАК ДОБАВИТЬ СОТРУДНИКА
1. Администратор: Настройки -> Аккаунт.
2. Выберите роль и создайте одноразовый код приглашения.
3. Сотрудник на своём устройстве создаёт аккаунт email + пароль.
4. После входа вводит код приглашения.
5. Администратор открывает «Пользователи и права» и настраивает галочки.

МОБИЛЬНЫЙ ДОСТУП
Подробно: см. раздел README-MOBILE ниже в этом файле.
Постоянная плашка облака поверх всех разделов удалена.


==============================================================================
РАЗДЕЛ ИЗ CLOUD-SETUP.txt
==============================================================================
СОЛНЦЕ КЕЙТЕРИНГ — ОБЛАЧНАЯ СИНХРОНИЗАЦИЯ

1. Supabase уже подключён к этому билду приложения.
2. SQL-схема, RLS, Storage и Realtime уже развернуты в проекте Supabase.
3. Откройте в приложении Настройки -> Аккаунт.
4. Создайте аккаунт владельца или войдите.
5. Создайте рабочую базу «Солнце Кейтеринг».
6. На первом компьютере нажмите «Перенести текущие данные в облако».
7. Для сотрудников создайте код приглашения. На другом устройстве сотрудник
    создаёт свой аккаунт, вводит код и получает доступ к общей рабочей базе.

Что синхронизируется:
- заказы и клиентские данные;
- каталог, цены и составы;
- склад, движения, поставщики;
- финансы, сотрудники, маршруты, настройки и другие рабочие sun*-данные;
- загруженные изображения: они переносятся в приватный Supabase Storage.

Офлайн:
Приложение продолжает работать с локальной копией. Когда интернет появляется,
изменения автоматически отправляются в облако. Realtime сообщает другим
устройствам об изменениях и обновляет локальную копию.

Безопасность:
- в браузере используется только Publishable/anon key;
- доступ к данным проверяется Row Level Security;
- service_role / secret key в браузер добавлять нельзя;
- изображения лежат в приватном bucket sun-media.


==============================================================================
РАЗДЕЛ ИЗ DEPLOY-ONLINE.txt
==============================================================================
ПОСТОЯННЫЙ ВХОД С ТЕЛЕФОНА

Приложение уже работает с облачной базой Supabase и не требует компьютера для хранения данных.
Чтобы открывать интерфейс из любой сети, папку приложения нужно один раз разместить на HTTPS static hosting (GitHub Pages / Cloudflare Pages / Netlify / Vercel).
После публикации на телефоне откройте HTTPS-адрес, войдите под тем же Supabase аккаунтом и добавьте сайт на главный экран как PWA.
Компьютер после этого может быть полностью выключен.


==============================================================================
РАЗДЕЛ ИЗ README-MOBILE.txt
==============================================================================
СОЛНЦЕ КЕЙТЕРИНГ — МОБИЛЬНЫЙ ДОСТУП И ОБЛАКО

ВАЖНО: Supabase хранит общую базу данных, но сам интерфейс приложения должен быть открыт по адресу (URL).

Вариант 1 — в одной Wi-Fi сети (уже работает):
1. На компьютере запустите start-mobile-server.bat.
2. Откройте PHONE-LINK.txt.
3. На телефоне, подключенном к той же Wi-Fi сети, откройте указанный адрес.
4. Войдите тем же облачным email и паролем.
5. Выберите рабочую базу «Солнце Кейтеринг». Данные подтянутся из Supabase.

Вариант 2 — работать с телефона из любой точки мира (рекомендуется):
1. Разместите содержимое этого архива на обычном HTTPS-хостинге статического сайта (например, Cloudflare Pages / Netlify / Vercel).
2. На телефоне откройте полученный https:// адрес в Safari или Chrome.
3. Войдите своим email и паролем.
4. После первого открытия можно добавить сайт на главный экран как PWA.
5. Все устройства работают с одной рабочей базой Supabase; компьютер держать включенным не нужно.

АДМИНИСТРАТОР
Email: dpavlov346@bk.ru
Рабочая база: Солнце Кейтеринг
Пароль не хранится в архиве. Используется пароль облачного аккаунта.

УПРАВЛЕНИЕ ОБЛАКОМ
Постоянная плашка «Облако» поверх всех разделов удалена. Облако и пользователи открываются только через Настройки -> Аккаунт.

ОФЛАЙН
После первого успешного входа и загрузки базы PWA хранит локальную рабочую копию. При восстановлении интернета изменения синхронизируются с Supabase.


==============================================================================
РАЗДЕЛ ИЗ ROLLBACK-V17.txt
==============================================================================
ОТКАТ v17

v17 не удаляет старую структуру sun_app_state и не заменяет существующий архив v16.
Если при тестировании найдена критическая проблема:
1. Закройте v17.
2. Запустите прежнюю папку v16.
3. Войдите в тот же Supabase аккаунт.
4. Загрузите облачную копию.

Новая v17 схема добавлена параллельно и не требуется для запуска v16.
Перед восстановлением старого состояния из backup используйте Настройки → Стабильность и резервирование → Восстановить.


==============================================================================
РАЗДЕЛ ИЗ SAAS-V16-README.txt
==============================================================================
СОЛНЦЕ КЕЙТЕРИНГ — SaaS v16

Что уже работает:
- отдельная рабочая база (workspace) для каждой компании;
- 14 дней Полного тарифа для новых компаний;
- выбор «Пустая база» или «Загрузить демо» при создании компании;
- тарифы Базовый / Профессиональный / Полный;
- лимиты сотрудников: 1 / 3 / без лимита;
- серверная проверка тарифа и функций;
- после окончания: 7 дней только просмотр, затем блокировка без удаления данных;
- SaaS-кабинет владельца сервиса: компании, тариф, срок, блокировка, индивидуальная функция;
- текущая рабочая база Солнце Кейтеринг сохранена на Полном тарифе без практического ограничения срока.

Для нового Supabase-проекта:
1. Выполнить SUPABASE-SETUP.sql.
2. Выполнить SUPABASE-RBAC-V3.sql.
3. Выполнить SUPABASE-SAAS-V16.sql.
4. Выполнить SUPABASE-SAAS-V16-FINALIZE.sql.

Для текущего Supabase-проекта эти миграции уже применены.

Что НЕ входит в v16:
- автоматическое списание денег;
- платёжный webhook;
- публичная страница оплаты/чекаут;
- автоматические письма об окончании подписки.
Сейчас владелец сервиса может активировать и продлевать тариф вручную из SaaS-кабинета.


==============================================================================
РАЗДЕЛ ИЗ V17-STABILITY-README.txt
==============================================================================
СОЛНЦЕ КЕЙТЕРИНГ · v17 STABILITY · LOCAL TEST

Эта версия предназначена для локального тестирования перед переносом на постоянный сервер.

КАК ЗАПУСТИТЬ
1. Распакуйте архив в отдельную папку.
2. Запустите start-local-test.bat.
3. Приложение откроется по http://localhost:8787/
4. Войдите в тот же облачный аккаунт Supabase.

ЧТО ИЗМЕНИЛОСЬ
- Старый sun_app_state НЕ удалён и остаётся аварийным мостом.
- Заказы, строки заказов, каталог, клиенты и настройки зеркалируются в отдельные таблицы v17.
- Облачное сохранение использует проверку revision. Устаревшая вкладка не может молча затереть более новую облачную версию.
- Несинхронизированные изменения отмечаются в локальной IndexedDB-очереди.
- После успешной синхронизации очередь очищается.
- Ошибки JavaScript сохраняются локально и отправляются в облачный журнал после появления интернета.
- Раз в день создаётся серверная резервная копия workspace.
- В Настройки добавлен блок «Стабильность и резервирование · v17».
- Из него можно вручную сделать backup, восстановить backup и выгрузить аварийный JSON.
- Добавлен /healthz для будущего серверного мониторинга.

ВАЖНО
v17 пока использует старую структуру как основной источник для интерфейса, а новую структуру как синхронное зеркало.
Это сделано намеренно для безопасного тестирования. После проверки нескольких реальных рабочих дней можно переключить заказы и каталог на новые таблицы как на основной источник.

ПЕРЕНОС НА СЕРВЕР ПОТОМ
Архитектура уже готова к HTTPS-хостингу: статические файлы + Supabase. Локальный server.js нужен только для удобного тестирования на компьютере.


v17.2: клиентские предложения показывают полный состав каждого бокса во всех шаблонах и PDF; высота строк/карточек рассчитывается динамически.
