Приложение miaPOS
Как пользоваться приложением miaPOS на аппаратном POS-терминале или smart-устройстве — вход, открытие дня, приём платежей, отчёты, закрытие дня.
Версия документа: 1.0 Версия продукта
(UI): 1.0.14 Дата: 01.05.2026
Внутреннее кодовое имя: POS-flow
Источники: референсные экраны из POS-flow/
(autentificare, deschidere-zi, tranzactii, rambursari, anulare,
rapoarte, inchidere-zi, setari-qr, setari-limba, suport)
Платформы: Android (Jetpack Compose) и iOS (SwiftUI) —
единый UX, минимальные различия в стиле
1. Обзор
miaPOS — это приложение для приёма мгновенных платежей, предназначенное для торговцев Молдовы. Основной маршрут процессинга — через схему MIA (Money Instant Acceptance, НБМ). Приложение работает на специализированных Android POS-терминалах (или smart-устройствах) и на iOS для SoftPOS, с co-brand логотипом MAIB для терминалов, выпущенных этим банком.
1.1 Покрываемая функциональность
- 3-шаговая аутентификация (терминал → OTP → счёт продавца) с опцией онбординга по email
- Жизненный цикл операционного дня: Открытие дня → транзакции → Закрытие дня с Z-отчётом
- Генерация платёжного QR (динамический / статический / гибридный) с фиксированной, контролируемой или произвольной суммой
- Отмена сгенерированного QR до оплаты
- Список транзакций с детализацией (сообщение
pacs.008+ SWIFT-код плательщика) - Полный или частичный возврат с выбором стандартизированной причины
- Настройки на уровне продавца: тип QR, язык, контакт поддержки
- Версия приложения видна в разделе Поддержка
1.2 Бренд и co-branding
- Основной логотип mia (плати мгновенно) на экранах аутентификации/QR
- Co-brand логотип банка (например, MAIB) отображается под логотипом mia на экране QR
- Подвал приложения: Powered by FINERGY
- Текущая версия:
1.0.14(видна в Профиль → Поддержка)
1.3 Поддерживаемые языки
- Română (по умолчанию)
- English
- Русский
Выбирается через Профиль → Изменить язык.
1.4 Технический стек (внутренняя справка)
- Android: Kotlin + Jetpack Compose, MVI (см.
pos-android/) - iOS: Swift + SwiftUI (см.
pos-ios/) - Backend:
pos-terminal-svc,cap-svc,mia-db— gRPC/REST + ISO20022 (pacs.008.001.10)
2. Аутентификация
Поток состоит из 3 шагов (терминал → OTP → пользователь) плюс опция получения данных онбординга на email.
2.1 Шаг 1 — Данные о терминале
Поля:
| Поле | Тип | Валидация |
|---|---|---|
| IDNO | numeric | 13 цифр — фискальный ID торговца |
| ID terminal | alphanumeric | формат T0001 (выдаётся банком/оператором) |
Действия: - Următorul / Далее (активна после заполнения обоих полей) - Ссылка «Trimiteți onboarding pe email / Отправить онбординг на email» — для случая, когда у торговца нет учётных данных
2.2 Модальное окно — Отправка онбординга на email
- Информационный текст: «Если вы согласны, мы отправим ваши данные онбординга на указанный email-адрес»
- Поля: IDNO, Email
- Действия: Назад / OK
2.3 Шаг 2 — Подтверждение OTP
- 6 OTP-ячеек, последовательный автофокус
- Маскированный номер (например,
+373 *****212) - Re-send кулдаун: 25 секунд («Retrimiteți după 25 sec / Повторить через 25 сек»)
- ← (back) — возврат к экрану данных терминала
2.4 POS успешно активирован
Визуальное подтверждение (✓ зелёный), что терминал успешно ассоциирован. Кнопка Continua / Продолжить → переход к логину пользователя.
2.5 Шаг 3 — Вход в учётную запись
Информационный заголовок (read-only): - Terminal #T0001
- IDNO: 999*******999 - Название торговца (например,
Finergy Tech) - Адрес магазина (например, Кишинёв, 31
august 60)
Поля:
| Поле | Тип | Валидация |
|---|---|---|
| Login | alphanumeric | логин продавца (или телефон — см. флаг Использовать номер телефона в Merchant Portal) |
| Parola / Пароль | password | + 👁 переключатель видимости |
Действие: Intră / Войти.
Замечание: продавцы создаются через Merchant Portal (раздел Vânzători / Продавцы), где администратор может сгенерировать/перегенерировать пароль и отправить его продавцу на email.
3. Жизненный цикл операционного дня
Обязательный жизненный цикл: для обработки транзакций день должен быть открыт; в конце день закрывается с генерацией Z-отчёта.
3.1 День закрыт (gating для транзакций)
- Иконка 🌙 + сообщение «Ziua este închisă. Pentru a începe, deschideți ziua. / День закрыт. Чтобы начать — откройте день.»
- Primary-кнопка Deschide ziua / Открыть день (full-width, синяя)
3.2 Постоянный баннер в Профиле, когда день закрыт
- Баннер вверху страницы Профиль: «Ziua este închisă / День закрыт»
- Рядом с именем оператора появляется кнопка Deschide ziua / Открыть день (заменяет кнопку Закрыть день в нормальном состоянии)
3.3 Подтверждение открытия дня
Модальное окно с 2 действиями: Înapoi / Назад / Confirmă / Подтвердить.
3.4 Терминал — день открыт (ввод суммы)
Заголовок: Terminal (id: T0001) + описательная строка с
названием торговца и адресом.
Центральный контент: - Метка текущего типа QR (например, «QR
dinamic / Динамический QR» — задаётся в Настройках QR) - Подсказка:
«Introduceți suma / Введите сумму» - Дисплей суммы:
0.00 - Цифровая клавиатура (1–9, 0, разделитель
., ⌫ backspace, OK)
3.5 Сумма введена — кнопка OK активна
- Введённая сумма (например,
10.00) - Иконка ✕ → сбрасывает сумму на
0.00 - OK (зелёный) → генерирует QR
3.6 QR сгенерирован (день открыт)
Layout с тёмно-синим фоном: - Логотип MIA + MAIB
(co-brand) сверху по центру - ← (back) сверху-слева • 🔗 share
сверху-справа - Карточка SUMA DE PLATĂ / СУММА К ОПЛАТЕ
+ значение (например, 10.00 MDL, зелёным) -
QR-код в центре (на бело-кремовом фоне) - Подвал:
timestamp HH:MM:SS, ДД.ММ.ГГГГ + локация торговца - Кнопка
Anulare / Отмена (красный текст) внизу
3.7 Платёж завершён
- ✓ зелёный (иконка)
- Текст: «Plata a fost finalizată! / Платёж завершён!»
- Сумма (например,
10.00 MDL) - Поля: Дата и ID транзакции
- Кнопка OK(8) — обратный отсчёт автозакрытия 8 сек
- Вторичная кнопка 📋 (чек/clipboard) — отображает детали/копию чека
3.8 Транзакция в дневном списке
Список с заголовком Tranzacții / Транзакции + действия сверху-справа: - 🔄 обновить список - 📄 текущий отчёт (Z-отчёт в реальном времени)
Элемент списка: - #2790 + сумма
(10.00 MDL) + зелёная галочка ✓ (оплачено) - Timestamp
(HH:MM, ДД.ММ.ГГГГ)
3.9 Закрытие дня — подтверждение + Z-отчёт
Триггер: кнопка Închide ziua / Закрыть день на странице Профиль.
Модальное окно с 2 действиями: Înapoi / Назад / Confirmă / Подтвердить.
3.10 Подтверждение / закрытие Z-отчёта
После подтверждения отображается Z-отчёт (итоги дня: число транзакций, общая сумма, комиссии, возвраты) и закрывается финально кнопкой OK.
Внимание: после закрытия день возвращается в состояние закрыт — любая новая транзакция потребует повторного открытия дня.
4. Транзакции
4.1 Список
Элемент списка: - #ID транзакции (например,
#2790) - Сумма + валюта
(10.00 MDL) - Timestamp -
Индикатор состояния (справа-снизу): - ✓ зелёный =
PLATIT / ОПЛАЧЕНО (успешно) - ↻ серо-голубой = частично
или полностью возвращено
Заголовок — действия: - 🔄 обновить - 📄 текущий отчёт
4.2 Детали транзакции
Отображаемые поля:
| Поле | Пример |
|---|---|
| ID транзакции | 2790 |
| Сумма | 10.00 MDL |
| Состояние | PLATIT / ОПЛАЧЕНО ✓ |
| Тип SWIFT-сообщения | PACS.008.001.10 |
| ID SWIFT-сообщения | 1585701D-9922-43E0-9FCE-29E3FA2D1863 (UUID) |
| SWIFT-код плательщика | CMTBMD2X (банк-эмитент) |
| Дата | 19:29, 24.04.2026 |
Действия снизу: - 🔄 Rambursare / Возврат (full-width, тёмно-синий) - 📋 чек (icon button — копия чека для печати)
4.3 Состояния транзакции
| Состояние | Индикатор | Возможные переходы |
|---|---|---|
| PLATIT / ОПЛАЧЕНО | ✓ зелёный | → ВОЗВРАТ ЧАСТИЧНЫЙ / ВОЗВРАТ ПОЛНЫЙ |
| RAMBURSAT PARȚIAL / ВОЗВРАТ ЧАСТИЧНЫЙ | ↻ голубой | можно возместить разницу |
| RAMBURSAT INTEGRAL / ВОЗВРАТ ПОЛНЫЙ | ↻ серый | финал — без дополнительных действий |
5. Возвраты
5.1 Форма возврата
Триггер: кнопка Rambursare / Возврат в деталях транзакции.
Поля:
| Поле | Тип | Валидация |
|---|---|---|
| Motivul / Причина | dropdown | фиксированный список (см. 5.2) — обязательно |
| Descrierea / Описание | свободный текст | рекомендуется, обязательно для Технической проблемы |
| Rambursare parțială / Частичный возврат | toggle | если включён — появляется поле
Сумма частичного возврата ≤ исходной |
Под полями: read-only Дата +
ID транзакции.
Primary-кнопка Rambursarea sumei / Вернуть сумму (активна только когда выбрана причина).
5.2 Список причин возврата (dropdown)
Стандартизированные причины (ISO 20022 — RJCT reasons +
custom):
- Транзакция отклонена из-за timeout у PSP-получателя
- Неправильный счёт
- Счёт плательщика недействителен или отсутствует
- Счёт получателя недействителен или отсутствует
- Счёт плательщика закрыт
- Указанный счёт заблокирован или его обработка запрещена
- Счёт получателя закрыт
- Валюта счёта недействительна или отсутствует
- Код транзакции не принят / не авторизован
- Сумма платежа превышает максимально допустимую
- Доступных средств недостаточно для покрытия указанной суммы
- Дубликат
- Полученная сумма не соответствует согласованной/ожидаемой
- Сумма недействительна или отсутствует
- Реквизиты получателя недостаточны/некорректны
- Решение клиента (самая частая — возврат по запросу покупателя)
- ID сообщения / ID инструкции не уникален
- Сообщение/платёж невозможно обработать из-за технической проблемы у участника
- Счёт плательщика не существует
- Реквизиты платежа не соответствуют требованиям
- Техническая проблема
5.3 Частичный возврат — указание суммы
- Toggle Rambursare parțială / Частичный возврат = ON
- Поле Suma de rambursare parțială / Сумма частичного
возврата (например,
5) - Исходная сумма отображается под toggle (
10.00 MDL) - Кнопка Rambursarea sumei / Вернуть сумму (активна после валидации)
5.4 Статус «В обработке» (ожидание решения банка)
- Сообщение: «Așteptarea deciziei privind rambursarea fondurilor / Ожидание решения по возврату средств»
- Progress bar (анимированный)
- Кнопка Вернуть сумму заблокирована до получения ответа
5.5 Список с частично возвращённой транзакцией
- Исходная транзакция
#2791—10.00 MDL✓ - Транзакция-возврат
#2792—5.00 MDL↻ (иконка refund)
Техническое примечание: возврат в MIA генерирует новую обратную транзакцию (сообщение
pacs.008в обратном направлении), а не модифицирует исходную транзакцию.
5.6 Детали возврата
Поля: - ID транзакции (например, 2792) - Сумма возврата
(5.00 MDL) - Состояние: RAMBURSAT
PARȚIAL / ВОЗВРАТ ЧАСТИЧНЫЙ ↻ - Тип SWIFT-сообщения (в pre-prod
может отображаться MOCK; в проде
pacs.008.001.10) - ID SWIFT-сообщения (UUID) -
SWIFT-код плательщика (в pre-prod
INTEGRATION SVC; в проде реальный код банка) - Дата
6. Отмена QR
6.1 Кнопка Отмена на экране QR
Кнопка Anulare / Отмена (красный текст, внизу) — доступна, пока QR активен и платёж ещё не выполнен.
6.2 Подтверждение отмены
Модальное окно с 2 действиями: Înapoi / Назад / Confirmă / Подтвердить.
После отмены: - QR становится недействительным (любой последующий скан завершится ошибкой) - Операция появляется в Merchant Portal → Operațiuni online / Онлайн-операции со статусом REFUZATE / ОТКЛОНЕНО
7. Настройки QR-кода
Настройка управляет тем, как генерируются QR-коды на этом терминале (per-vânzător / на уровне продавца).
7.1 Динамический QR (по умолчанию)
- QR dinamic / Динамический QR (default): принимает только фиксированную сумму. Одна транзакция на QR.
- Поле Timp de acțiune / Время действия (сек) — TTL
для QR (default
300сек = 5 мин) - Кнопка Aplică / Применить
7.2 Статический QR (с подопциями)
QR static / Статический QR: принимает фиксированные, контролируемые и неуказанные суммы. Транзакций на QR — без ограничения.
Подтипы: - Suma fixă / Фиксированная сумма — заранее напечатанная; клиент не может изменить - Suma controlată / Контролируемая сумма — лимиты min/max; клиент подтверждает в пределах - Sumă nespecificată / Неуказанная сумма — клиент вводит любую сумму
Кейс использования: статические QR-коды, напечатанные на стикере у кассы / в счёте.
7.3 Гибридный QR (с подопциями)
QR hibrid / Гибридный QR: принимает только фиксированные и контролируемые суммы. Не более одной транзакции одновременно.
Подтипы: - Фиксированная сумма - Контролируемая сумма
Кейс использования: физический QR на POS для конкретных сумм (например, ежемесячный абонемент) — один клиент за раз.
7.4 Время действия (TTL)
Общее поле для всех типов — длительность действия QR в секундах
(default 300).
| Тип QR | Транзакций/QR | Подопции | Рекомендуемый TTL |
|---|---|---|---|
| Динамический | 1 | – | 300 сек |
| Статический | ∞ | Фикс / Контр / Не указ | большой (дни) |
| Гибридный | 1 одновременно | Фикс / Контр | 300–600 сек |
8. Настройки — язык
8.1 Доступ из Профиля
Доступ через
Profil → Schimbați limba / Профиль → Изменить язык.
8.2 Выбор языка
Список из 3 опций: - Română (по умолчанию, синяя галочка ✓) - English - Русский
Кнопка Aplică / Применить — становится активной только при изменении языка.
Сохранение: настройка хранится локально на устройстве (на уровне продавца, если на одном устройстве несколько).
9. Поддержка
Доступ через Profil → Suport / Профиль → Поддержка.
Поля: - Telefon / Телефон: 60665335
(clickable — tel: link) - Email:
[email protected] (clickable —
mailto: link) - App version:
1.0.14 (read-only)
Замечание: версия приложения используется командой поддержки для корреляции багов с конкретными билдами.
10. Профиль
Центральная точка пользовательского меню. Содержание:
Заголовок - Заголовок «Profil / Профиль» - ⏏ logout (сверху-справа — красный текст)
Карточка учётной записи продавца - Аватар - Имя оператора (например, Operator 5) - ID vânzător / ID продавца: 370 - Închide ziua / Закрыть день (сверху-справа в карточке) — primary красная кнопка
Карточка терминала и локации (read-only) -
Terminal #T0001 - Название магазина
(Finergy store) - Адрес
(Кишинёв, 31 august 60)
Действия меню - ⊞ Setări pentru codul QR / Настройки QR-кода → §7 - 🌐 Schimbați limba / Изменить язык → §8 - 🎧 Suport / Поддержка → §9
Подвал: Powered by FINERGY
Bottom navigation (3 вкладки): - ⊞ Terminal / Терминал — клавиатура для платежа (§3.4) - ⇄ Tranzacții / Транзакции — список (§4) - 👤 Profil / Профиль (активна)
11. Общие компоненты (визуальные элементы и UX-паттерны)
11.1 Цветовая кодировка состояний
| Цвет | Значение | Примеры |
|---|---|---|
| 🟢 Зелёный | Успех / положительный финал | ОПЛАЧЕНО ✓, «POS успешно активирован», «Платёж завершён!», кнопка OK на клавиатуре |
| 🟡 Голубой | Основное действие | Открыть день, Применить, активные ссылки, индикатор частичного возврата |
| 🔴 Красный | Деструктивные действия / внимание | Отмена, Закрыть день, logout, баннер «День закрыт» |
| ⚫ Серый | Неактивно / нейтральный финал | Disabled-кнопка (например, OK при сумме
0.00), ВОЗВРАТ ПОЛНЫЙ |
| ⚫ Тёмно-синий | Заголовок / выделенный контекст | Карточка суммы на экране QR, кнопка Возврат |
11.2 Повторяющиеся паттерны
- Подтверждение деструктивных действий или с большим эффектом: модальное окно с 2 кнопками Назад / Подтвердить — используется для отмены QR, открытия/закрытия дня.
- Top-bar с иконкой отчёта (📄): на странице Транзакции — отображает промежуточный отчёт за текущий день.
- Авто-закрытие с обратным отсчётом: экран успешного
платежа отображает
OK(8)с обратным отсчётом 8 сек → возврат на клавиатуру. - Bottom navigation 3-tab: Терминал / Транзакции / Профиль — единый паттерн для Android и iOS.
- Контекстный header: на платёжных экранах и при
логине отображает
Terminal (id: X)+ локацию — продавец остаётся ориентирован.
11.3 Multi-currency
В продакшене Молдовы валюта — MDL (явно подписана в
UI). Приложение структурно поддерживает переменную валюту (на уровне
сообщения pacs.008), но текущий UI оптимизирован под
MDL.
11.4 Offline-режим
QR генерируется локально (детерминистическая EMVCo-строка), но
подтверждение платежа требует подключения к
pos-terminal-svc. Транзакции, выполненные плательщиком в
момент отключения терминала от сети, появляются в списке при последующей
синхронизации.
12. Технический глоссарий
| Термин | Определение |
|---|---|
| MIA | Money Instant Acceptance — IPS-схема Молдовы (НБМ) |
| pacs.008.001.10 | ISO 20022 payment instruction (версия, используемая в MIA) |
| PSP-acceptant | Payment Service Provider у торговца — в нашем случае miaPOS через эквайер-банк |
| IDNO | Государственный идентификатор юридического лица (Молдова) |
| ID terminal | Уникальный код терминала (например, T0001) |
| OTP | One-Time Password — 6-значный код, полученный по SMS |
| Динамический / статический / гибридный QR | Варианты QR с разными сроками жизни и логикой (см. §7) |
| Z-отчёт | Кумулятивный отчёт, формируемый при закрытии операционного дня |
| SWIFT-код плательщика | BIC банка-эмитента счёта плательщика (например,
CMTBMD2X = MAIB) |
13. Полный жизненный цикл (текстовая диаграмма)
┌──────────┐
│ Запуск │
│ app │
└────┬─────┘
│
▼
┌─────────────────┐ НЕТ ┌──────────────────┐
│ Данные терминала│ ──────►│ Отправить onboard│
│ (IDNO + ID) │ │ на email │
└────┬────────────┘ └──────────────────┘
│
▼
┌──────────┐
│ OTP SMS │
│ (6 цифр) │
└────┬─────┘
│
▼
┌──────────────────┐
│ POS активирован ✓│
└────┬─────────────┘
│
▼
┌──────────────────┐
│ Login (User+Pwd) │
└────┬─────────────┘
│
▼
┌──────────────────────────┐
│ Профиль — ДЕНЬ ЗАКРЫТ │
│ [Открыть день] │
└────┬─────────────────────┘
│ confirm
▼
┌──────────────────────────┐ ┌────────────────────┐
│ Терминал — клавиатура │ ─► │ Отмена QR │
└────┬─────────────────────┘ └────────────────────┘
│ OK
▼
┌──────────────────────────┐
│ QR сгенерирован (TTL 300)│
└────┬─────────────────────┘
│ скан + подтверждение клиента
▼
┌──────────────────────────┐
│ Платёж завершён ✓ │ ──► Транзакция в списке
└──────────────────────────┘
│
│ (после N транзакций)
▼
┌──────────────────────────┐
│ Профиль — [Закрыть день] │
└────┬─────────────────────┘
│ confirm
▼
┌──────────────────────────┐
│ Z-отчёт отображён → OK │
└──────────────────────────┘
14. DoD (Definition of Done) для документации
15. Приложения — референсы экранов
POS-flow/
├── autentificare/ (1, 2-onboarding-email, 3-otp, 4-pos-activat, 5-login)
├── deschidere-zi/ (1.0-zi-inchisa-tranzactii, 1.1-profil-zi-inchisa,
│ 2-confirma-deschidere, 3-keypad-empty, 4-keypad-suma,
│ 5-qr-activ, 6-plata-finalizata, 8-tranz-in-lista)
├── tranzactii/ (1-список, 2-детали)
├── rambursari/ (1-форма, 2-dropdown-причины, 3-частичный,
│ 4-ожидание, 5-список-возврата, 6-детали)
├── anulare/ (1-кнопка, 2-подтверждение)
├── inchidere-zi/ (1-подтверждение, 2-закрытие-отчёта)
├── rapoarte/ (1-профиль, 2-детали-транз)
├── setari-qr/ (1-динамический, 2-статический-с-подопциями,
│ 3-гибридный-с-подопциями, 4-ttl)
├── setari-limba/ (1-профиль, 2-список)
└── suport/ (1-контактная-инфо, 2-профиль)
Документ сгенерирован на основе референсных экранов из
POS-flow/ — версия 1.0.14 приложения miaPOS
для Android и iOS.