Документация · Руководство пользователя

Приложение miaPOS

Как пользоваться приложением miaPOS на аппаратном POS-терминале или smart-устройстве — вход, открытие дня, приём платежей, отчёты, закрытие дня.

АудиторияТорговец
СложностьБазовый
Обновлено2026-06-01

Версия документа: 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 + ID terminal

Поля:

Поле Тип Валидация
IDNO numeric 13 цифр — фискальный ID торговца
ID terminal alphanumeric формат T0001 (выдаётся банком/оператором)

Действия: - Următorul / Далее (активна после заполнения обоих полей) - Ссылка «Trimiteți onboarding pe email / Отправить онбординг на email» — для случая, когда у торговца нет учётных данных

2.2 Модальное окно — Отправка онбординга на email

Модальное окно отправки данных онбординга на email
  • Информационный текст: «Если вы согласны, мы отправим ваши данные онбординга на указанный email-адрес»
  • Поля: IDNO, Email
  • Действия: Назад / OK

2.3 Шаг 2 — Подтверждение OTP

Экран подтверждения OTP — 6 ячеек + кулдаун 25 сек
  • 6 OTP-ячеек, последовательный автофокус
  • Маскированный номер (например, +373 *****212)
  • Re-send кулдаун: 25 секунд («Retrimiteți după 25 sec / Повторить через 25 сек»)
  • ← (back) — возврат к экрану данных терминала

2.4 POS успешно активирован

Экран «POS activat cu succes / POS успешно активирован» + кнопка Continua

Визуальное подтверждение (✓ зелёный), что терминал успешно ассоциирован. Кнопка Continua / Продолжить → переход к логину пользователя.

2.5 Шаг 3 — Вход в учётную запись

Экран Вход в аккаунт — Login + Пароль

Информационный заголовок (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 для транзакций)

Tab Транзакции с индикатором «День закрыт» + Открыть день
  • Иконка 🌙 + сообщение «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 Терминал — день открыт (ввод суммы)

Tab Терминал — клавиатура «Введите сумму» QR динамический

Заголовок: Terminal (id: T0001) + описательная строка с названием торговца и адресом.

Центральный контент: - Метка текущего типа QR (например, «QR dinamic / Динамический QR» — задаётся в Настройках QR) - Подсказка: «Introduceți suma / Введите сумму» - Дисплей суммы: 0.00 - Цифровая клавиатура (1–9, 0, разделитель ., ⌫ backspace, OK)

3.5 Сумма введена — кнопка OK активна

Клавиатура с введённой суммой «10.00» — кнопка OK зелёная активная + ✕ для сброса
  • Введённая сумма (например, 10.00)
  • Иконка ✕ → сбрасывает сумму на 0.00
  • OK (зелёный) → генерирует QR

3.6 QR сгенерирован (день открыт)

Сгенерированный платёжный QR 10.00 MDL с лого MIA + MAIB + кнопка Отмена

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 + OK(8) + чек
  • ✓ зелёный (иконка)
  • Текст: «Plata a fost finalizată! / Платёж завершён!»
  • Сумма (например, 10.00 MDL)
  • Поля: Дата и ID транзакции
  • Кнопка OK(8) — обратный отсчёт автозакрытия 8 сек
  • Вторичная кнопка 📋 (чек/clipboard) — отображает детали/копию чека

3.8 Транзакция в дневном списке

Список транзакций — #2790 10.00 MDL ✓ + иконки Z-отчёта и обновления

Список с заголовком Tranzacții / Транзакции + действия сверху-справа: - 🔄 обновить список - 📄 текущий отчёт (Z-отчёт в реальном времени)

Элемент списка: - #2790 + сумма (10.00 MDL) + зелёная галочка ✓ (оплачено) - Timestamp (HH:MM, ДД.ММ.ГГГГ)

3.9 Закрытие дня — подтверждение + Z-отчёт

Модальное окно «Подтвердите закрытие — Вы уверены, что хотите закрыть день?»

Триггер: кнопка Închide ziua / Закрыть день на странице Профиль.

Модальное окно с 2 действиями: Înapoi / Назад / Confirmă / Подтвердить.

3.10 Подтверждение / закрытие Z-отчёта

Модальное окно «Закрыть страницу отчёта?» с OK + Назад

После подтверждения отображается Z-отчёт (итоги дня: число транзакций, общая сумма, комиссии, возвраты) и закрывается финально кнопкой OK.

Внимание: после закрытия день возвращается в состояние закрыт — любая новая транзакция потребует повторного открытия дня.


4. Транзакции

4.1 Список

Список транзакций с одной успешной транзакцией

Элемент списка: - #ID транзакции (например, #2790) - Сумма + валюта (10.00 MDL) - Timestamp - Индикатор состояния (справа-снизу): - ✓ зелёный = PLATIT / ОПЛАЧЕНО (успешно) - ↻ серо-голубой = частично или полностью возвращено

Заголовок — действия: - 🔄 обновить - 📄 текущий отчёт

4.2 Детали транзакции

Детали транзакции #2790 ОПЛАЧЕНО — кнопка Возврат + чек

Отображаемые поля:

Поле Пример
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)

Открытый dropdown — полный список причин возврата

Стандартизированные причины (ISO 20022 — RJCT reasons + custom):

  1. Транзакция отклонена из-за timeout у PSP-получателя
  2. Неправильный счёт
  3. Счёт плательщика недействителен или отсутствует
  4. Счёт получателя недействителен или отсутствует
  5. Счёт плательщика закрыт
  6. Указанный счёт заблокирован или его обработка запрещена
  7. Счёт получателя закрыт
  8. Валюта счёта недействительна или отсутствует
  9. Код транзакции не принят / не авторизован
  10. Сумма платежа превышает максимально допустимую
  11. Доступных средств недостаточно для покрытия указанной суммы
  12. Дубликат
  13. Полученная сумма не соответствует согласованной/ожидаемой
  14. Сумма недействительна или отсутствует
  15. Реквизиты получателя недостаточны/некорректны
  16. Решение клиента (самая частая — возврат по запросу покупателя)
  17. ID сообщения / ID инструкции не уникален
  18. Сообщение/платёж невозможно обработать из-за технической проблемы у участника
  19. Счёт плательщика не существует
  20. Реквизиты платежа не соответствуют требованиям
  21. Техническая проблема

5.3 Частичный возврат — указание суммы

Toggle «Частичный возврат» включён + поле Сумма + ID 2791
  • Toggle Rambursare parțială / Частичный возврат = ON
  • Поле Suma de rambursare parțială / Сумма частичного возврата (например, 5)
  • Исходная сумма отображается под toggle (10.00 MDL)
  • Кнопка Rambursarea sumei / Вернуть сумму (активна после валидации)

5.4 Статус «В обработке» (ожидание решения банка)

Статус «Ожидание решения по возврату средств» + progress bar
  • Сообщение: «Așteptarea deciziei privind rambursarea fondurilor / Ожидание решения по возврату средств»
  • Progress bar (анимированный)
  • Кнопка Вернуть сумму заблокирована до получения ответа

5.5 Список с частично возвращённой транзакцией

Список транзакций — #2792 5.00 MDL с индикатором ↻ для возврата
  • Исходная транзакция #279110.00 MDL
  • Транзакция-возврат #27925.00 MDL ↻ (иконка refund)

Техническое примечание: возврат в MIA генерирует новую обратную транзакцию (сообщение pacs.008 в обратном направлении), а не модифицирует исходную транзакцию.

5.6 Детали возврата

Детали транзакции-возврата #2792 — Состояние ВОЗВРАТ ЧАСТИЧНЫЙ + тип сообщения MOCK

Поля: - 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

Экран сгенерированного QR с кнопкой «Отмена» внизу

Кнопка Anulare / Отмена (красный текст, внизу) — доступна, пока QR активен и платёж ещё не выполнен.

6.2 Подтверждение отмены

Модальное окно «Подтвердите отмену — Вы уверены, что хотите отменить этот QR?»

Модальное окно с 2 действиями: Înapoi / Назад / Confirmă / Подтвердить.

После отмены: - QR становится недействительным (любой последующий скан завершится ошибкой) - Операция появляется в Merchant Portal → Operațiuni online / Онлайн-операции со статусом REFUZATE / ОТКЛОНЕНО


7. Настройки QR-кода

Настройка управляет тем, как генерируются QR-коды на этом терминале (per-vânzător / на уровне продавца).

7.1 Динамический QR (по умолчанию)

Настройки QR — выбран QR динамический + Время действия 300 сек
  • QR dinamic / Динамический QR (default): принимает только фиксированную сумму. Одна транзакция на QR.
  • Поле Timp de acțiune / Время действия (сек) — TTL для QR (default 300 сек = 5 мин)
  • Кнопка Aplică / Применить

7.2 Статический QR (с подопциями)

Настройки QR — выбран QR статический + подопции Фикс/Контролируемая/Неуказанная сумма

QR static / Статический QR: принимает фиксированные, контролируемые и неуказанные суммы. Транзакций на QR — без ограничения.

Подтипы: - Suma fixă / Фиксированная сумма — заранее напечатанная; клиент не может изменить - Suma controlată / Контролируемая сумма — лимиты min/max; клиент подтверждает в пределах - Sumă nespecificată / Неуказанная сумма — клиент вводит любую сумму

Кейс использования: статические QR-коды, напечатанные на стикере у кассы / в счёте.

7.3 Гибридный QR (с подопциями)

Настройки QR — выбран QR гибридный + подопции Фикс/Контролируемая сумма

QR hibrid / Гибридный QR: принимает только фиксированные и контролируемые суммы. Не более одной транзакции одновременно.

Подтипы: - Фиксированная сумма - Контролируемая сумма

Кейс использования: физический QR на POS для конкретных сумм (например, ежемесячный абонемент) — один клиент за раз.

7.4 Время действия (TTL)

Настройки QR — поле Время действия 300 сек

Общее поле для всех типов — длительность действия QR в секундах (default 300).

Тип QR Транзакций/QR Подопции Рекомендуемый TTL
Динамический 1 300 сек
Статический Фикс / Контр / Не указ большой (дни)
Гибридный 1 одновременно Фикс / Контр 300–600 сек

8. Настройки — язык

8.1 Доступ из Профиля

Профиль — ссылка «Изменить язык»

Доступ через Profil → Schimbați limba / Профиль → Изменить язык.

8.2 Выбор языка

Настройки языка — Română (выбрано) + English + Русский

Список из 3 опций: - Română (по умолчанию, синяя галочка ✓) - English - Русский

Кнопка Aplică / Применить — становится активной только при изменении языка.

Сохранение: настройка хранится локально на устройстве (на уровне продавца, если на одном устройстве несколько).


9. Поддержка

Страница Поддержка — Телефон 60665335 + email + App version 1.0.14

Доступ через Profil → Suport / Профиль → Поддержка.

Поля: - Telefon / Телефон: 60665335 (clickable — tel: link) - Email: [email protected] (clickable — mailto: link) - App version: 1.0.14 (read-only)

Замечание: версия приложения используется командой поддержки для корреляции багов с конкретными билдами.


10. Профиль

Страница Профиль — Оператор + ID + кнопки Настройки QR / Изменить язык / Поддержка / Закрыть день

Центральная точка пользовательского меню. Содержание:

Заголовок - Заголовок «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.