A Flutter-based digital wallet prototype built for the Pakistani market as part of an SPM course project.
- Project Overview
- Team
- Features
- Architecture
- Getting Started
- Running Tests
- Project Management
- Sprint Summary
- Risk Register
- Deliverables
Finora is an Android-first digital wallet prototype demonstrating peer-to-peer transfers, QR merchant payments, utility bill payments, and virtual card management in a single Flutter application.
The project was built over 5 days (4th–9th May 2026) as a Software Project Management (SPM) course project, applying agile methodology with daily sprints, Jira-based tracking, and agentic AI-assisted development via Google Antigravity.
- All backend services are simulated locally — no live bank APIs, NADRA, or payment gateways
- SQLite for persistence — full schema with users, wallets, transactions, cards, billers, merchants, audit_log tables
- Provider for state management — clean
ChangeNotifierhierarchy withChangeNotifierProxyProviderfor dependency injection - Layered architecture — Presentation → State → Service → Persistence
| Member | Role | Student ID |
|---|---|---|
| Abdulrehman Baloch | Project Captain / Backend & Mock-Services | i221182 |
| Ayesha Kiani | Full-Stack / Integration & Testing | i221283 |
| Sana Fatima | Frontend / UI-UX Lead | i221160 |
| Feature | Status | Sprint |
|---|---|---|
| CNIC-based registration with regex validation | ✅ Done | Sprint 1 |
Simulated biometric verification (local_auth) |
✅ Done | Sprint 1 |
| 6-digit PIN creation + mock OTP flow | ✅ Done | Sprint 1 |
| Real-time wallet balance in PKR (SQLite) | ✅ Done | Sprint 1 |
| Transaction history with search and filter | ✅ Done | Sprint 1 |
| In-app transaction receipt view | ✅ Done | Sprint 1 |
| P2P transfers by phone number | ✅ Done | Sprint 2 |
| QR code merchant payments | ✅ Done | Sprint 2 |
| Digital receipt generation | ✅ Done | Sprint 2 |
| Transaction rollback on simulated failure | ✅ Done | Sprint 2 |
| Virtual debit card with masked PAN, expiry, CVV | ✅ Done | Sprint 3 |
| Card freeze/unfreeze toggle (persisted) | ✅ Done | Sprint 3 |
| Bill payments (electricity, gas, water, mobile) | ✅ Done | Sprint 3 |
| Transaction limit configuration | ✅ Done | Sprint 3 |
| 2FA for high-value transfers (Settings screen) | ✅ Done | Sprint 3 |
| Feature | Status |
|---|---|
| Bill payments against mock biller catalogue | ✅ Done |
| Transaction limit slider in Settings | ✅ Done |
| 2FA (PIN + biometric) toggle in Settings | ✅ Done |
lib/
├── app.dart # MultiProvider root
├── app_shell.dart # Bottom navigation shell
├── main.dart
├── core/
│ ├── routing/app_router.dart # go_router configuration
│ └── theme/ # Design system (colors, typography, spacing, radii)
├── data/
│ ├── db/database.dart # SQLite schema + migrations
│ ├── models/ # Dart data models
│ └── services/ # Mock service classes
│ ├── auth_service.dart
│ ├── wallet_service.dart
│ ├── transaction_service.dart # Idempotency + rollback
│ ├── payment_service.dart # P2P + QR
│ ├── card_service.dart # Luhn-valid PAN generation
│ └── bill_service.dart # Biller seeding + payment
├── features/
│ ├── auth/ # Registration, OTP, PIN, Login, Biometric
│ ├── wallet/ # Home dashboard, Activity/History
│ ├── payments/ # Send Money, QR Scanner, Confirmation
│ ├── cards/ # Virtual card display + management
│ ├── bills/ # Multi-step bill payment flow
│ └── settings/ # Settings, 2FA limits, profile
└── shared/
└── widgets/ # PrimaryButton, FinoraTextField, TransactionTile, etc.
users(id, cnic, phone, full_name, pin_hash, biometric_enabled, created_at)
wallets(id, user_id, balance, currency, created_at, updated_at)
transactions(id, wallet_id, type, status, amount, recipient_name, recipient_phone,
merchant_id, description, failure_reason, created_at)
cards(id, wallet_id, user_id, pan_encrypted, expiry_month, expiry_year,
cvv_hash, status, created_at)
billers(id, name, category, code)
merchants(id, name, category, qr_code)
audit_log(id, user_id, action, entity_type, entity_id, details, created_at)- Flutter 3.x (
flutter --version) - Android Studio or VS Code
- Android device or emulator (Android 8.0+)
git clone https://github.com/sanamir23/finora.git
cd finora
flutter pub get
flutter runflutter build apk --release
# APK: build/app/outputs/flutter-apk/app-release.apkflutter testThe test suite (test/widget_test.dart) covers all 5 core user journeys:
- Authentication & Onboarding — CNIC regex, OTP generation/verification, PIN validation
- Wallet Management — Balance debit/credit, insufficient funds guard, PKR formatting
- P2P Transfer — Phone validation, simulated failure, idempotency check
- QR Merchant Payment — QR payload parsing, merchant lookup, receipt generation
- Virtual Card Management — PAN generation, masking, expiry, CVV, freeze toggle
Plus rollback, idempotency, bill payment, and non-functional requirement checks.
All project management is tracked in Jira: https://finora-team-spm.atlassian.net
- Scrum board with 5 sprints (Sprint 0 through Sprint 4)
- Epics: Foundation & Tooling, Authentication, Wallet, Payments, Cards & Bills, QA & Delivery
- Risk register: 6 tracked risks with mitigation strategies (SCRUM-92 through SCRUM-97)
- Daily standups with status updates in ticket comments
- Burndown: All MUST HAVE stories completed by Sprint 3
| Sprint | Theme | Dates | Status |
|---|---|---|---|
| Sprint 0 | Foundation & Tooling | 4 May | ✅ Done |
| Sprint 1 | Auth & Wallet | 5 May | ✅ Done |
| Sprint 2 | P2P + QR Payments | 6 May | ✅ Done |
| Sprint 3 | Cards + Bills + 2FA | 7 May | ✅ Done |
| Sprint 4 | QA, Docs, Demo | 8–9 May | ✅ Done |
| Risk ID | Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|---|
| R1 | Five-day timeline slippage | High | High | Daily sprint cutoffs; AI-assisted parallelism |
| R2 | Mock service drift from realistic behaviour | Medium | Medium | Latency injection + failure-rate toggle |
| R3 | Antigravity / MCP tooling instability | Medium | Medium | Git discipline after every agent task |
| R4 | Scope creep | Medium | High | Scope locked Day 1; change control via Jira |
| R5 | Demo day bug surfacing | Low | High | Day 5 freeze; APK on device by midday |
| R6 | Team member unavailability | Low | High | Daily standups; Ayesha as swing resource |
- Android APK (see Releases)
- Flutter source code (this repository)
- SQLite schema with ER diagram (see
lib/data/db/database.dart) - Mock service contracts (Dart-doc comments in
lib/data/services/) - Test report (
test/widget_test.dart) - README (this document)
- Final project report (PDF — submitted separately)
- 5-minute PowerPoint (submitted separately)
- Demo video recording (submitted separately)
To Do → In Progress → In Review → Done
Tickets were updated directly by the Google Antigravity AI agent via the Atlassian Rovo MCP server, ensuring the Jira board stayed in sync with every code commit without manual overhead.
Prepared by: Abdulrehman Baloch (i221182) · Ayesha Kiani (i221283) · Sana Fatima (i221160)
Submission: 9th May 2026