IOC Retail 0.1.0 — IOC GROUP
Windows x64 · автономная пилотная сборка

БЫСТРЫЙ ЗАПУСК
1. Запустите IOC-Retail-Setup.exe и выберите пустую папку программы.
2. Нажмите «Установить». Для установки интернет и права администратора не нужны.
3. Дождитесь запуска локальной MariaDB и открытия браузера.
4. Пройдите мастер: проверка компонентов → база → компания → администратор → завершение.
5. Задайте собственный пароль, минимум 12 символов. Общего пароля по умолчанию нет.
6. Для знакомства включите демо-товары. Для реального каталога оставьте флажок выключенным.
7. Откройте смену, заведите товары и проведите приход, затем используйте POS.

ТРЕБОВАНИЯ
Windows 10/11 x64, .NET Framework 4.8, современный Edge/Chrome, 1 ГБ свободного
места для программы и дополнительное место для базы/копий. PHP 8.4.26, MariaDB
11.4.10 и необходимые библиотеки VC++ включены. Внешних CDN при работе нет.
На этом компьютере сборка проверена; проверка на отдельной чистой Windows VM
не проводилась. EXE не имеет подписи коммерческим сертификатом издателя.

АДРЕСА И ДАННЫЕ
Программа по умолчанию: %LOCALAPPDATA%\IOC GROUP\IOC Retail\App
Данные: %LOCALAPPDATA%\IOC GROUP\IOC Retail\Data
Web/POS: http://127.0.0.1:8787
MariaDB: 127.0.0.1:33079
Device Bridge: 127.0.0.1:9123
Порты доступны только локально. При занятом порте запуск выводит ошибку.
Не открывайте эти порты в интернет. Эта сборка рассчитана на один компьютер.

В папке Data находятся конфигурация, локальная база, сеансы, журналы и backups.
Её права ограничены текущим пользователем Windows и SYSTEM. Не публикуйте
config.json/control.json: они содержат локальные секреты. Другие учётные записи
Windows не разделяют эту установку. Изменять папку Data во время работы нельзя.

РАБОТА БЕЗ ИНТЕРНЕТА
Обычные продажи работают без интернета через локальный сервер. Если сам сервер
временно недоступен, открытая/ранее закэшированная POS сохраняет новые продажи
в IndexedDB и повторяет отправку каждые 30 секунд. Данные привязаны к последнему
вошедшему пользователю и компании; офлайн-кэш доступен 8 часов. Требуются ранее
успешный вход, открытая смена и загрузка каталога. Не очищайте данные браузера
до синхронизации. Ожидающий чек не считается подтверждённым сервером.
При изменении цены/остатка или закрытии смены операция остаётся конфликтной.
Повторная отправка использует исходный UUID. Автоматическое изменение содержимого
конфликтного чека запрещено. Закрытие смены и выход блокируются при локальной очереди.
Офлайн-работа не фискализирует операции и не принимает банковские платежи.

ОСТАНОВКА И УДАЛЕНИЕ
Закройте IOC Retail через значок в области уведомлений → «Остановить IOC Retail».
Закрытие вкладки браузера не останавливает сервер. Автозапуск при входе в Windows
можно включить при установке; по умолчанию он выключен.
Удаление доступно в «Установленные приложения» Windows или через Uninstall.exe.
Удаляются только файлы программы из манифеста, ярлыки и регистрация программы.
База и резервные копии сохраняются. Пустые папки могут остаться.
Сборка не перезаписывает существующую установку. Автообновление не реализовано.

РЕЗЕРВНОЕ КОПИРОВАНИЕ
Раздел «Резервные копии» → «Создать копию» → «Скачать».
Копия создаётся штатным mariadb-dump в согласованной транзакции; сохраняется SHA-256.
Храните копии на отдельном носителе. Автоматическое расписание в 0.1.0 не включено.
Для восстановления закройте программу, откройте PowerShell в папке программы:
  .\Restore-Backup.ps1 -BackupFile 'D:\Backups\IOC-....sql'
Перед импортом создаются холодная копия всей базы и дополнительный SQL-дамп.
При ошибке импорта выполняется попытка возврата SQL-копии. Все пользовательские
сеансы после успешного восстановления отзываются. Для восстановления используйте
только доверенные копии этой версии. Восстановление проверено на тестовой базе.
При переносе на другой компьютер сперва установите и инициализируйте IOC Retail,
затем восстановите SQL-копию; не переносите старый config.json с чужими путями.

ЧЕКИ И ОБОРУДОВАНИЕ
Печать из браузера использует системные драйверы Windows. Размер страницы и
принтер выбираются в системном диалоге. Чеки явно помечены как нефискальные.
USB-сканер в режиме клавиатуры вводит штрихкод в поиск; Enter добавляет товар.
Device Bridge имеет защищённый токеном loopback API: GET /health, /printers,
/ports; POST /print с JSON {printer,text}. Токен находится в config.json,
передаётся заголовком Authorization: Bearer <bridge_token>. CORS не открыт.
Bridge печатает текст через драйвер Windows. Физическая печать на реальном
оборудовании не проверена. Работа с весами, денежным ящиком, дисплеем покупателя,
COM-сканерами и ESC/POS-протоколами в этой версии не реализована.

ГРАНИЦЫ ВЕРСИИ
Это устанавливаемый первый этап большого ТЗ, не готовый коммерческий аналог UMAG.
Полный перечень реализации и отсутствующих модулей приведён в FEATURES.txt.
Нет сертифицированной фискализации, SaaS-биллинга, полноценной multi-store
эксплуатации, внешних платёжных интеграций и механизмов промышленного обновления.
Нагрузочное, аппаратное и независимое security-тестирование не проводилось.
Windows использует локальный PHP CLI server; он не предназначен для публичного
промышленного многопользовательского веб-сервиса.

АРХИТЕКТУРА И ИСХОДНЫЙ КОД
app/                 REST-контроллер, контекст доступа, сервисы продаж/склада
database/schema.sql  25 таблиц InnoDB, DECIMAL, индексы, внешние ключи
public/              HTML, автономные CSS/JS, service worker, манифест PWA
resources/lang/      RU/KZ словари для PHP; JSON-словари лежат в public/assets
windows-client/      C# launcher, Device Bridge, Windows manifest
installer/           исходники EXE-установщика/удаления, Build.ps1, генерация иконок
tests/               интеграционные, изоляционные и конкурентные проверки
Restore-Backup.ps1   восстановление с предварительными копиями
API.txt              маршруты и протокол REST

Сборка из исходников (Windows, PowerShell):
  .\installer\Build.ps1
Build.ps1 скачивает официальные ZIP PHP и MariaDB с фиксированными SHA-256,
компилирует C# штатным csc из .NET Framework, создаёт автономный Setup EXE.
Сборщик использует промежуточную папку build; готовый файл — build\output.

Тесты меняют данные; запускайте только в отдельной папке с «test» в имени:
  $env:IOC_DATA_DIR='C:\Tests\ioc-test-data'
  .\IOC Retail.exe --headless
  node .\tests\integration.mjs
  .\runtime\php\php.exe -c "$env:IOC_DATA_DIR\php.ini" .\tests\isolation.php
  .\runtime\php\php.exe -c "$env:IOC_DATA_DIR\php.ini" .\tests\concurrency.php
integration.mjs рассчитан на ещё не настроенную базу. Тестовые пароли генерируются
случайно и сохраняются только внутри выделенной тестовой папки.

ЛИЦЕНЗИИ
Сторонние компоненты сохраняют свои лицензии. См. THIRD-PARTY.txt и лицензии
в runtime/. При распространении MariaDB предоставляйте соответствующий исходный
код из поставленного архива mariadb-11.4.10-source.tar.gz вместе с дистрибутивом.
