02 one merchant
one_merchant_app — POS-терминал для мерчантов и агентов.
Назначение¶
Приложение для мерчантов и агентов OneWallet. Работает с accountType=merchant/agent. Версия 1.3.0+1. Мерчантов заводит администратор — самостоятельной регистрации нет (экраны /register/* отсутствуют).
Функции: ввод суммы оплаты, приём платежа через NFC или QR, просмотр истории, P2P-переводы, мини-приложения.
Отличия от one_loop_app¶
| Функция | one_loop | one_merchant |
|---|---|---|
| KYC (онбординг с верификацией) | ✓ | ✗ |
| Самостоятельная регистрация | ✓ | ✗ |
| NFC write (программирование меток) | ✓ | ✗ |
| NFC read (приём оплаты) | ✗ | ✓ |
| POS экран (ввод суммы) | ✗ | ✓ |
| Создание инвойса/QR-оплаты | ✗ | ✓ |
| Referral flow при регистрации | ✓ | ✗ |
Управление NFC-метками /nfc-tags |
✓ | ✗ |
| Guard B1a (zombie-state регистрации) | ✓ | ✗ |
| Guard B6 (заполнение профиля) | ✓ | ✗ |
| Тема (primary color) | #FF5B00 Tangerine |
#110138 Night Sky |
POS Flow¶
flowchart TD
Home([/pos — ввод суммы]) --> Method{PosMethodSheet<br>выбор способа}
Method -->|NFC| NfcAwait[/pos/nfc<br>ожидание касания]
Method -->|QR| QrScreen[/pos/qr<br>показать QR-инвойс]
NfcAwait -->|тег считан| CreateIntent[createIntent на сервере]
QrScreen -->|покупатель сканирует| Polling[polling статуса intent]
CreateIntent --> Polling
Polling -->|succeeded| Result[/pos/result — успех]
Polling -->|failed/expired| ResultFail[/pos/result — ошибка]
Result --> Home2([вернуться на /pos])
ResultFail --> Home2
Сумма хранится в satang (int) в posSessionProvider — float-погрешности исключены. Ввод через AmountKeypad: каждый тап сдвигает разряды влево (тап 1 → 1 satang = ฿0.01).
Экраны¶
| Маршрут | Экран | Примечание |
|---|---|---|
/ |
SplashScreen |
Начальный redirect |
/welcome |
WelcomeScreen |
Только неавторизованные |
/signin |
SignInScreen |
Только неавторизованные |
/forgot-password |
ForgotPasswordScreen |
Только неавторизованные |
/forgot-password/otp |
ForgotPasswordOtpScreen |
Только неавторизованные |
/reset-password |
ResetPasswordScreen |
Только неавторизованные |
/setup-pin |
SetupPinScreen |
PIN не установлен (B5) |
/setup-biometric |
SetupBiometricScreen |
После установки PIN |
/pin-unlock |
PinUnlockScreen |
Заблокирован (B2) |
/home |
HomeScreen |
Shell, index 0 |
/pos |
PosAmountScreen |
Shell, index 1 — ввод суммы |
/apps |
AppsScreen |
Shell, index 2 |
/profile |
ProfileScreen |
Shell, index 3 |
/pos/nfc |
PosNfcAwaitScreen |
Push route, без навбара |
/pos/qr |
PosQrScreen |
Push route, без навбара |
/pos/result |
PosResultScreen |
Push route, без навбара |
/p2p/my-qr |
MyQrScreen |
Авторизован |
/p2p/scan |
QrScannerScreen |
Авторизован |
/p2p/phone-transfer |
PhoneTransferScreen |
Авторизован |
/p2p/preview |
P2pPreviewScreen |
Авторизован |
/p2p/status |
P2pStatusScreen |
Авторизован |
/wallet |
WalletScreen |
Push route, без навбара |
/history |
HistoryScreen |
Push route, без навбара |
/transaction-detail |
TxDetailScreen |
Push route, extra: TxDetailArgs |
/miniapp-viewer |
MiniappViewerScreen |
WebView мини-приложений |
Тема¶
MerchantTheme расширяет AppTheme из onewallet_shared_ui, переопределяя primary-цвет:
| Параметр | Значение |
|---|---|
| Primary color (light) | #110138 (AppTheme.nightSky) |
| Primary color (dark) | #110138 (AppTheme.nightSky) |
| Базовая тема | AppTheme.lightTheme / AppTheme.darkTheme с copyWith |
| Кнопки | ElevatedButton с backgroundColor: MerchantTheme.primary |
| Splash (native) | Конфигурация через flutter_native_splash |
Тема объявлена в /lib/theme/merchant_theme.dart. Реэкспортирует AppTheme, AppSpacing, AppRadius из onewallet_shared_ui для единой точки импорта.