food-market/docs/pos.md
nns b305cc9b9a
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
feat(pos): отложенный чек (park/resume) + снимок корзины
- Cart.Snapshot()/Restore() — независимая копия строк и скидки на чек.
- SaleViewModel: ParkCommand («Отложить» — сохранить чек, начать новый) и
  ResumeCommand («Вернуть» — восстановить отложенный); кнопки на экране продажи.
- Unit-тест независимости снимка (38 POS unit-тестов зелёные). Скриншоты обновлены.

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

91 lines
7.1 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; замеры холодного старта — см. docs/pos-progress.md.