food-market/docs/pos.md
nns 9cca062061 perf(pos): R2R-сборка + замеры первого запуска Windows + Defender-гайд
- Публикация win-x64 с ReadyToRun (по одному RID, nice — dev-vm не уронили).
- Замеры на Windows-VM: первый запуск (свежая распаковка) 3.8–5.4 с (было 7.5 с),
  прогретый 219 мс. Первый запуск упирается в Defender (скан свежего неподписанного
  114 МБ exe) + холодное чтение диска, не в JIT.
- docs/pos.md: раздел «первый запуск медленный — что делать» (исключение Defender,
  прогрев при установке, подпись exe). Trimming оставлен выкл. (Avalonia на рефлексии).
- Мелочь: убран warning CS8826 (имена параметров partial-методов смены).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:44:06 +05:00

105 lines
8.5 KiB
Markdown
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.

# Касса 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 медленный (4–5 с) — что делать
Самый первый запуск кассы сразу после установки занимает 4–5 с (с R2R; без R2R было
7,5 с). Это НЕ код кассы: Windows Defender на лету сканирует свежий неподписанный
exe (~114 МБ, self-contained), плюс холодное чтение файла с диска. Каждый следующий
запуск — ~0,2 с. Как ускорить первый запуск на кассовом ПК:
1. **Исключение в Defender** для папки кассы (одноразово, администратором):
`Add-MpPreference -ExclusionPath "C:\food-market-pos"` (PowerShell от админа).
2. **Прогрев при установке** — установщик может один раз запустить `foodmarket.Pos.exe`
(например, `--smoke`) после распаковки, чтобы Defender просканировал файлы заранее.
3. **Подпись exe** (code signing) — позже; подписанный бинарник Defender сканирует
быстрее и не держит пользователя на SmartScreen.
Замеры холодного старта (Linux/Windows, R2R и без) — см. docs/pos-progress.md.