orders.ts — добавлено rrn?: string в SubmitOrderRequest.
metro.config.js — modules/ в watchFolders.
tsconfig.json — modules/**/* в include.
Build configuration (критично!)
android/ генерируется expo prebuild
Файлы android/build.gradle и android/gradle.properties перезаписываются при каждом expo prebuild. Изменения ниже нужно повторно применять или автоматизировать.
android/gradle.properties — добавить/изменить:
# PayApp SDK (core-centerm-noBio-release.aar) requires minSdk 30; K10 is API 30android.minSdkVersion=30# PayApp SDK AARs compiled with Kotlin 2.2.0 — need Kotlin 2.1+ compilerandroid.kotlinVersion=2.1.20# Disable RN Gradle plugin JDK alignment — KotlinTopLevelExtension is interface in Kotlin 2.1+react.internal.disableJavaVersionAlignment=true# Align JVM target for Java and Kotlin (needed when disableJavaVersionAlignment=true)kotlin.jvm.target.validation.mode=IGNORE
android/build.gradle — изменить:
Pinned kotlin-gradle-plugin version (строка в dependencies {} блока buildscript):
Принимает только ResponseHandler. Могут быть перегрузки с terminalId, shopId, merchantId, ConnectionSettings — проверить на реальном устройстве. Текущая реализация вызывает минимальный вариант.
Что НЕ сделано / требует проверки
На реальном устройстве (K10):
PayAppBridgeModule.initialize() — убедиться что onInitStateChange: Initialized приходит
Текущая реализация вызывает dev.createEcrTerminal(responseHandler) — только с ResponseHandler. Если SDK требует дополнительные параметры (TMS connection settings, terminal ID) — нужно расширить вызов. Проверить на реальном устройстве или документацию SDK.
Автоматизация gradle-патчей:
android/ генерируется expo prebuild. Варианты:
Config plugin (Expo) — модифицирует build.gradle и gradle.properties программно
Post-prebuild скрипт — sed/patch после expo prebuild
Зафиксировать android/ — убрать из .gitignore, не запускать prebuild без нужды
Рекомендация
Написать Expo config plugin в modules/payapp-bridge/ который автоматически патчит Gradle-файлы. Это стандартный подход для Expo managed workflow.
Фискализация:
FiscalCoreClient остаётся стабом. Интеграция с ФЯ (api012) — отдельная задача. См. Fiscal Core Integration.
Типы TerminalResponseResult:
ResponseHandlerImpl.kt обрабатывает onDone(result). Конкретные подклассы TerminalResponseResult (Done.APPROVED, Done.DENIED, Error) — проверить на реальном устройстве, возможно потребуется расширить маппинг.
Архитектурные решения
PaymentClient отдельно от FiscalCoreClient
Почему: Эквайринг (авторизация карты, RRN) и фискализация (чеки, 54-ФЗ) — разные системы с разными failure modes. PayApp SDK отвечает только за эквайринг.
Kotlin 2.1.20
Почему: SDK AARs скомпилированы с Kotlin 2.2.0 (metadata version 2.2.0). Kotlin 1.9.x читает metadata до 2.0.0, Kotlin 2.0.x — до 2.1.0. Только Kotlin 2.1+ читает 2.2.0.
Почему:core-centerm-noBio-release.aar объявляет minSdkVersion=30. K10 работает на Android 11 (API 30), так что ограничение не влияет на целевое устройство.
Suspend + Continuation pattern
Почему: SDK вызовы асинхронные — startPaymentTransaction() не возвращает результат напрямую, а вызывает ResponseHandler.onDone(). Bridge оборачивает это в Kotlin suspendCoroutine + continuation, Expo Module получает Promise.
Команды для сборки
# Переключиться на Node 20export PATH="/opt/homebrew/opt/node@20/bin:$PATH"# Генерация android/ (если нужно с нуля)cd /Users/alekseymikhailov/IdeaProjects/erp-pos/mobilenpx expo prebuild --platform android# После prebuild — применить gradle-патчи (см. секцию "Build configuration")# Сборка и установка на устройствоnpx expo run:android# Dev-сервер (после первой сборки)npx expo start --dev-client