# SoftIBANPOS — App SoftPOS A2A (Android)

> Documentazione di sviluppo software dell'app **SoftIBANPOS** (progetto Flutter `IBANPOS`).
> Versione app corrente: **v1.0.0**. Distribuita da GTPOS (Impostazioni → App SoftIBANPOS / SoftPOS).

---

## 1. Cos'è

**SoftIBANPOS** è il **SoftPOS** Android di IBANWAY: trasforma uno smartphone o un POS Android in un terminale di accettazione **Account-to-Account (A2A)** basato su **PIS / Open Banking**. **Non** è un POS a carte: inizia bonifici **SCT Inst** conto-a-conto.

Flusso di incasso:
1. L'operatore inserisce l'importo sul terminale.
2. L'app mostra un **QR** (formato **EPC069-12 SEPA** + deeplink dell'app **Vuolli PagoIBAN**).
3. Il cliente inquadra il QR con la propria app bancaria/Vuolli e autorizza il pagamento.
4. GTPOS riceve l'esito (via OKSA/Fabrick, attualmente simulati) e l'app mostra l'esito + scontrino.

Catena: **SoftIBANPOS → GTPOS → OKSA (IBANWAY) → Fabrick → SCT Inst**. L'app dialoga con GTPOS in **HTTPS/JSON**; è **GTPOS** a gestire il protocollo bancario **ISO 8583**.

---

## 2. Stack tecnico

| Ambito | Tecnologia |
|---|---|
| Framework | **Flutter / Dart** (Android: smartphone e POS Android) |
| Networking | **dio** (HTTP + certificate pinning) |
| Storage sicuro | **flutter_secure_storage** (Android Keystore) |
| QR | **qr_flutter** (EPC SEPA + deeplink Vuolli) |
| Biometria | **local_auth** (impronta / volto) |
| Anti-tamper | **safe_device** (root/emulatore detection) |
| State / utils | **provider**, **intl**, **crypto** |
| Package id | `com.ibanway.ibanpos` |
| Build | `compileSdk 36`, `targetSdk 34`, Java/Kotlin 17 |
| Output | APK release **arm64** ~17.7 MB (split-per-abi) |

Progetto locale: `C:\IBANPOS-flutter`. Distribuzione: scaricabile da GTPOS (`/downloads`, metadati in `app-info.json`).

---

## 3. Architettura del progetto

```
lib/
├── main.dart                 # bootstrap + routing
├── config.dart               # baseUrl (https://ibanway.net), IbanColors
├── api.dart                  # Dio + certificate pinning + secure storage
├── security.dart             # root detection + sblocco biometrico
├── models.dart               # modelli dati
├── screens/
│   ├── activation_screen.dart  # attivazione via codice pairing
│   ├── operator_screen.dart    # home operatore
│   ├── terminal_screen.dart    # inserimento importo
│   ├── qr_payment_screen.dart  # QR incasso A2A
│   ├── history_screen.dart     # storico transazioni
│   ├── balance_screen.dart     # saldo (riservato operatore)
│   └── receipt_screen.dart     # scontrino
└── widgets/                    # logo, tastierino
```

---

## 4. Funzionalità (v1.0.0)

| Funzione | Descrizione |
|---|---|
| **Attivazione** | Pairing del terminale tramite **codice di attivazione** generato da GTPOS. Alla conferma il device riceve **device token** + **certificato di sicurezza** (salvati cifrati nel Keystore). |
| **Operatore** | Schermata principale: avvio nuovo incasso, accesso a storico e saldo. |
| **Incasso QR (A2A)** | Inserimento importo → generazione **QR EPC SEPA + deeplink Vuolli** → attesa autorizzazione → esito. |
| **Storico** | Elenco delle transazioni del terminale con stato ed esito. |
| **Saldo** | Saldo del conto di accredito, **riservato all'operatore** (mai mostrato sul display lato cliente). |
| **Scontrino** | Ricevuta dell'operazione conclusa. |
| **Sicurezza** | Keystore per token/certificato, **sblocco biometrico**, **root detection**, **certificate pinning** TLS. |

> Lo scanner QR lato app è stato rimosso per compatibilità SDK: l'attivazione è a **inserimento manuale del codice**. L'app **mostra** i QR di incasso, non li scansiona.

---

## 5. Sicurezza

- **In transito**: HTTPS/TLS + certificate pinning (dio).
- **A riposo**: Android Keystore (flutter_secure_storage) per device token e certificato.
- **Identità device**: token JWT (90 gg) + **certificato firmato da GTPOS** (30 gg) emesso all'attivazione, con rinnovo periodico e revoca lato GTPOS.
- **Integrità ambiente**: root/emulatore detection (safe_device), sblocco biometrico opzionale.

---

## 6. Build dell'APK

```bash
# nella cartella C:\IBANPOS-flutter
flutter pub get
flutter build apk --release            # split-per-abi (arm64, armv7, x86_64)
# output: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk (~17.7 MB)
```

Caricare l'APK come `ibanpos-latest.apk` in `public_html/downloads/` su Hostinger; GTPOS lo espone automaticamente (vedi `app-info.json`).

> Nota compatibilità: l'APK arm64 copre gli smartphone/POS Android moderni; per emulatori x86 o device armv7 serve l'APK universale.

---

## 7. Versionamento

Versionamento semantico **MAJOR.MINOR.PATCH** (allineato a GTPOS). Ad ogni rilascio dell'app:
1. Aggiornare il **CHANGELOG** qui sotto.
2. Aggiornare l'array `APP_RELEASES` nella pagina **App SoftIBANPOS** del back-office.
3. Aggiornare `downloads/app-info.json` (version, build) e caricare la nuova APK.

---

## 8. CHANGELOG

### [1.1.0] — 2026-06-08 — *Logo ufficiale + Device Trust*

**Nuovo**
- **Logo IBANWAY ufficiale** come icona dell'app (icona adattiva Android, sfondo navy).
- **Raccolta dati di verifica del dispositivo** (`device_trust.dart`): modello, OS, patch, fingerprint, root/emulatore, modalità sviluppatore, biometria, rete/VPN + UUID stabile nel Keystore; inviati a GTPOS all'attivazione e nei heartbeat (vedi `TRUST.md`).
- **APK universale** (arm64 + armv7 + x86): installabile su tutti i dispositivi Android.

**Tecnico**
- Nuove dipendenze: `device_info_plus`, `connectivity_plus`. `flutter_launcher_icons` per le icone.

### [1.0.0] — 2026-06-06 — *Prima release compilabile*

**Nuovo**
- Progetto Flutter completo e compilabile (APK release arm64 ~17.7 MB).
- Attivazione del terminale via codice di pairing con emissione di device token + certificato di sicurezza.
- Incasso **Account-to-Account** con QR (EPC SEPA + deeplink Vuolli PagoIBAN).
- Schermate: operatore, terminale, QR pagamento, storico, saldo (riservato operatore), scontrino.
- Sicurezza: Android Keystore, sblocco biometrico, root detection, certificate pinning TLS.

**Note tecniche**
- Connessione a GTPOS in HTTPS/JSON; ISO 8583 gestito da GTPOS.
- Scanner QR rimosso per compatibilità SDK (attivazione a inserimento manuale).
- `compileSdk 36`, `targetSdk 34`.
