- docs/moysklad-pos-startup.md: прямой замер «Кассы МойСклад» (Celeron N4120, 99–113 с до готовности; каталог перезаписывается целиком, полный JSON+FTS) — подтверждённые причины, не догадки. - docs/pos-progress.md: раздел «Мгновенный старт» — что сделано (касса из локальной базы + фоновый синк, дельта остатков, gzip-каталог ×7.3, синк вне UI-потока) + таблица замеров (Linux/стенд + Win11 VM + 1 ядро как прокси Celeron). Цель <2 с тёплый старт на слабом CPU достигнута (<1 с). Серверный кэш снимка осознанно не делали (риск памяти, путь «раз на установку»). - deploy/pos-install.ps1: установщик Windows (исключение Defender + прогрев + ярлык); холодный старт 10 с → 4,5 с. deploy/pos-win-measure.ps1 — скрипт замеров на VM. - docs/pos.md: обновлён раздел первого запуска + варианты/стоимость подписи exe (не покупали). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
108 lines
8.7 KiB
Markdown
108 lines
8.7 KiB
Markdown
# Касса food-market — инструкция (кассир и администратор)
|
||
|
||
Кроссплатформенная касса на Avalonia 11 / .NET 8. Работает на Windows 10/11 и
|
||
Linux x64. Быстрая, без лишнего; офлайн-режим; сервер — food-market (`api/pos/v1`).
|
||
|
||
## Установка
|
||
|
||
### Windows 10/11
|
||
1. Скачайте `food-market-pos-win-x64-<версия>.zip` (ссылка — в админке, раздел
|
||
«Точки продаж») и распакуйте в любую папку, напр. `C:\food-market-pos`.
|
||
2. Запустите `foodmarket.Pos.exe`. .NET устанавливать НЕ нужно (сборка self-contained).
|
||
3. Ярлык на рабочий стол — по желанию (правой кнопкой по exe → «Создать ярлык»).
|
||
|
||
### Linux x64 (Ubuntu и др.)
|
||
1. Распакуйте `food-market-pos-linux-x64-<версия>.tar.gz`.
|
||
2. `chmod +x foodmarket.Pos && ./foodmarket.Pos`.
|
||
3. Для весов/принтера по COM добавьте пользователя в группу `dialout`.
|
||
4. Либо запустите переносимый `food-market-pos-<версия>-x86_64.AppImage` (если собран).
|
||
|
||
### Скачать (администратор)
|
||
В админке на странице **«Кассы»** (точки продаж) — карточка «Кассовое приложение»
|
||
со ссылками «Скачать для Windows / для Linux». Ссылки и версия задаются на сервере
|
||
в конфигурации (секция `Pos`: `LatestVersion`, `DownloadWindows`, `DownloadLinux`).
|
||
|
||
### Автообновление
|
||
При старте касса сверяет свою версию (`VERSION.txt` в сборке) с `GET /api/pos/v1/version`
|
||
и при более новой версии показывает в статус-баре «Доступно обновление …» со ссылкой.
|
||
|
||
## Первый запуск (администратор точки)
|
||
1. **Адрес сервера** — URL вашего food-market (напр. `https://admin.food-market.kz`).
|
||
2. **Регистрация устройства** — касса привязывается к точке продаж (retail point).
|
||
Кассир видит только свои точки (к которым он привязан в админке).
|
||
3. **Вход кассира** — логин и PIN/пароль учётной записи кассира.
|
||
|
||
## Горячие клавиши (работа без мыши)
|
||
- **Сканер** — печатает штрихкод в поле ввода, **Enter** добавляет товар (keyboard-wedge, фокус не нужен).
|
||
- **F1** — помощь · **F2** — поиск товара по названию · **F7** — внесение/выплата.
|
||
- **F9** — возврат · **F10** — смена (открыть/закрыть, X/Z) · **F12** — оплата · **Esc** — отмена/очистить чек.
|
||
- **Del** — удалить выделенную строку · **+/−** — количество.
|
||
|
||
## Смена
|
||
- Открыть смену (ввести размен). Без открытой смены продавать нельзя.
|
||
- Внесение / выплата наличных (инкассация) — с причиной.
|
||
- X-отчёт — промежуточный (смена не закрывается); Z-отчёт — при закрытии (должно
|
||
быть / факт / разница). Деньги смены учитываются сервером в остатках счетов
|
||
(см. docs/money.md).
|
||
|
||
## Продажа
|
||
- Пробитие по сканеру или поиск по названию.
|
||
- Весовой товар: вес с весов по COM (CAS / Масса-К) или ручной ввод; весовой
|
||
штрихкод с префиксом 20–29 (код + вес/цена) распознаётся автоматически.
|
||
- Скидка на позицию и на чек (по праву).
|
||
- Оплата: наличные / карта / смешанная; показывается сдача.
|
||
- Отложенный чек — кнопка «Отложить» сохраняет текущий чек и открывает новый
|
||
(обслужить другого покупателя), «Вернуть» — восстанавливает отложенный.
|
||
|
||
## Возврат
|
||
- По чеку (номер или скан QR) — частичный или полный.
|
||
- Без чека — по праву администратора.
|
||
|
||
## Весы (COM/serial)
|
||
- Протоколы: CAS, Масса-К (ASCII). Настройка: порт (COM1 / /dev/ttyUSB0), скорость.
|
||
- Нет весов/связи — ручной ввод веса.
|
||
|
||
## Печать чека
|
||
- ESC/POS на чековый принтер: USB (`/dev/usb/lp0` или `COMn`), сеть (`tcp:IP:9100`),
|
||
ширина 58 мм (32 симв.) или 80 мм (48 симв.).
|
||
- Запасной вариант — текстовый/обычный принтер/PDF.
|
||
- X/Z-отчёты печатаются так же.
|
||
|
||
## Офлайн
|
||
- Каталог (товары, цены, штрихкоды, весовые) хранится локально (SQLite) — первичная
|
||
загрузка + дельта-синхронизация.
|
||
- Без сети касса продолжает работать: чеки пишутся локально и уходят на сервер
|
||
очередью с идемпотентным ключом (повтор не создаёт дублей).
|
||
- В статус-баре: «на связи / нет связи» и число чеков в очереди.
|
||
|
||
## Фискализация (ОФД Казахстана)
|
||
Сейчас касса НЕ фискализирует чеки (интерфейс-заглушка `IFiscalProvider`). Для
|
||
реальной фискализации KZ потребуется:
|
||
- Договор с ОФД-оператором (Казахтелеком/Webkassa/др.) и регистрация онлайн-ККМ.
|
||
- Реализация `IFiscalProvider.RegisterSaleAsync` под API выбранного оператора
|
||
(регистрация чека, получение фискального номера и QR, печать на чеке).
|
||
- Хранение ключей/токенов ОФД защищённо (как refresh-токен кассира).
|
||
- Серверная синхронизация фискальных признаков (поля уже есть в RetailSale).
|
||
|
||
## Производительность (замеры)
|
||
- Поиск по штрихкоду — ~14 мс, по названию на 30 000 товаров — ~47 мс (локальный SQLite с индексами).
|
||
- Первичная загрузка 30 000 товаров — ~9 с (однократно при настройке).
|
||
- Сборка self-contained + ReadyToRun (R2R). Холодный старт: Linux ~120 мс; Windows
|
||
прогретый — **~220 мс** (R2R) / ~150 мс (без R2R).
|
||
|
||
### Первый запуск на Windows медленный — что делать
|
||
Тёплый старт кассы — доли секунды (окно из локальной SQLite, синк в фоне). Медленный
|
||
только САМЫЙ первый запуск сразу после установки: Windows Defender на лету сканирует
|
||
свежий неподписанный бандл (~115 МБ, self-contained + R2R). Замер на Win11 VM:
|
||
холодный старт **10 с без исключения → 4,5 с с исключением Defender**; тёплый ~0,6 с.
|
||
Готовый установщик — `deploy/pos-install.ps1` (распаковка + исключение Defender от
|
||
админа + прогрев `--smoke` + ярлык). Вручную:
|
||
1. **Исключение в Defender** для папки кассы (одноразово, от админа):
|
||
`Add-MpPreference -ExclusionPath "<папка кассы>"`.
|
||
2. **Прогрев** — один запуск `foodmarket.Pos.exe --smoke` после распаковки.
|
||
3. **Подпись exe** (code signing) — на решение владельца, пока НЕ покупали: OV ~ $200–400/год
|
||
(Sectigo/DigiCert), EV ~ $300–600/год. Подписанный бинарник Defender сканирует быстрее,
|
||
EV сразу снимает предупреждение SmartScreen без исключения Defender.
|
||
Полные замеры до/после (Linux + Windows, 30 000 товаров) — см. docs/pos-progress.md,
|
||
раздел «Мгновенный старт».
|