Elite 102 — final project
Python banking system
Building a banking system from scratch
For the Elite 102 final project, I designed and built a fully functional terminal-based banking application in Python — no external libraries, no shortcuts. The entire system runs on Python's built-in sqlite3 module, managing a live relational database of accounts and transactions through a color-coded terminal interface.
The architecture is split across four modules: database.py handles the SQLite connection and schema initialization, accounts.py contains all business logic (deposits, withdrawals, transfers, interest), ui.py drives the ANSI color menu interface, and main.py ties it all together as the entry point. This separation of concerns mirrors the modular thinking I apply to mechanical systems — each component has a single responsibility and a defined interface.
The most challenging part was building the wire transfer system with proper atomic transactions — ensuring that if a debit succeeds but a credit fails, the database rolls back to its previous state rather than losing funds. This taught me that in both software and engineering, failure modes matter as much as the happy path.
Key features
- Account creation and closure with persistent SQLite storage — accounts and full transaction history survive across sessions.
- Deposits, withdrawals, and wire transfers with overdraft protection and atomic rollback on failure.
- Interest calculation applied per account, with the transaction logged to history.
- Color-coded terminal UI using ANSI escape codes — clear, readable, and professional without any external UI library.
- 40/40 passing
unittestsuite across 9 test classes, covering account creation, balance operations, transfers, edge cases, and error handling — all in under 0.5 seconds. - Relational database schema with a normalized
accountsandtransactionstable, using foreign keys and typed transaction records — a full audit trail of every operation.
Writing 40 unit tests before shipping wasn't just a course requirement — it changed how I think. Every function I write now, I ask: how would I prove this works? That mindset carries directly into engineering: test your assumptions, document your results, and don't trust a system you haven't verified under stress.
Completed — Elite 102 final project