import streamlit as st import json import datetime import random import pandas as pd import plotly.express as px import hashlib import time import os # Page configuration st.set_page_config( page_title="iBank AHR - Banking Redefined", page_icon="🏦", layout="wide", initial_sidebar_state="collapsed" ) # Custom CSS st.markdown(""" """, unsafe_allow_html=True) # Initialize session state if 'authenticated' not in st.session_state: st.session_state.authenticated = False if 'current_user' not in st.session_state: st.session_state.current_user = None if 'users' not in st.session_state: st.session_state.users = {} if 'accounts' not in st.session_state: st.session_state.accounts = {} if 'transactions' not in st.session_state: st.session_state.transactions = {} if 'page' not in st.session_state: st.session_state.page = "dashboard" # Initialize default data if empty def init_default_data(): if not st.session_state.users: st.session_state.users = { "demo": { "password": "5f4dcc3b5aa765d61d8327deb882cf99", # "password" "name": "Alex Johnson", "email": "alex.johnson@email.com", "phone": "+1 (416) 555-0123", "accounts": ["001-2345678", "002-3456789"] } } if not st.session_state.accounts: st.session_state.accounts = { "001-2345678": { "type": "Chequing", "balance": 12543.67, "currency": "CAD", "nickname": "Everyday Expenses", "transactions": ["TXN001", "TXN002", "TXN003"] }, "002-3456789": { "type": "Savings", "balance": 45678.90, "currency": "CAD", "nickname": "Rainy Day Fund", "transactions": ["TXN004", "TXN005"] } } if not st.session_state.transactions: st.session_state.transactions = { "TXN001": {"id": "TXN001", "date": "2024-01-15", "description": "Grocery Store", "amount": -156.78, "account": "001-2345678"}, "TXN002": {"id": "TXN002", "date": "2024-01-14", "description": "Salary Deposit", "amount": 3500.00, "account": "001-2345678"}, "TXN003": {"id": "TXN003", "date": "2024-01-13", "description": "Online Shopping", "amount": -89.99, "account": "001-2345678"}, "TXN004": {"id": "TXN004", "date": "2024-01-12", "description": "Interest Earned", "amount": 45.67, "account": "002-3456789"}, "TXN005": {"id": "TXN005", "date": "2024-01-10", "description": "Transfer", "amount": 500.00, "account": "002-3456789"}, } init_default_data() # Utility functions def hash_password(password): return hashlib.md5(password.encode()).hexdigest() def login(username, password): if username in st.session_state.users and st.session_state.users[username]["password"] == hash_password(password): st.session_state.authenticated = True st.session_state.current_user = username st.session_state.page = "dashboard" return True return False def register(username, password, name, email): if username in st.session_state.users: return False, "Username already exists" st.session_state.users[username] = { "password": hash_password(password), "name": name, "email": email, "phone": "", "accounts": [f"001-{random.randint(1000000, 9999999)}"] } account_num = st.session_state.users[username]["accounts"][0] st.session_state.accounts[account_num] = { "type": "Chequing", "balance": 1000.00, "currency": "CAD", "nickname": "Primary Account", "transactions": [] } return True, "Registration successful" # Page rendering functions def show_login(): st.markdown('

🏦 iBank AHR

', unsafe_allow_html=True) st.markdown("**Banking Redefined • Secure • Fast • Reliable**") tab1, tab2 = st.tabs(["Login", "Register"]) with tab1: st.subheader("Login to iBank AHR") login_user = st.text_input("Username") login_pass = st.text_input("Password", type="password") if st.button("Login", type="primary", use_container_width=True): if login(login_user, login_pass): st.success("Login successful!") time.sleep(1) st.rerun() else: st.error("Invalid username or password") st.info("**Demo:** Username: `demo` | Password: `password`") with tab2: st.subheader("Create New Account") reg_user = st.text_input("Choose Username") reg_pass = st.text_input("Choose Password", type="password") reg_name = st.text_input("Full Name") reg_email = st.text_input("Email") if st.button("Register", type="secondary", use_container_width=True): success, message = register(reg_user, reg_pass, reg_name, reg_email) if success: st.success(message) time.sleep(1) st.rerun() else: st.error(message) st.markdown("---") st.caption("🔒 256-bit Encryption • 🏦 CDIC Insured • 🇨🇦 Proudly Canadian") def show_dashboard(): user_data = st.session_state.users[st.session_state.current_user] accounts_data = st.session_state.accounts # Sidebar with st.sidebar: st.markdown(f"### Welcome, {user_data['name'].split()[0]}!") st.caption("Member since 2023") # Navigation if st.button("📊 Dashboard", use_container_width=True): st.session_state.page = "dashboard" st.rerun() if st.button("💰 Accounts", use_container_width=True): st.session_state.page = "accounts" st.rerun() if st.button("💸 Transfer", use_container_width=True): st.session_state.page = "transfer" st.rerun() if st.button("📅 Pay Bills", use_container_width=True): st.session_state.page = "bills" st.rerun() if st.button("📈 Investments", use_container_width=True): st.session_state.page = "investments" st.rerun() if st.button("💳 Cards", use_container_width=True): st.session_state.page = "cards" st.rerun() st.markdown("---") if st.button("🚪 Logout", use_container_width=True): st.session_state.authenticated = False st.session_state.current_user = None st.session_state.page = "dashboard" st.rerun() # Main content st.markdown("## 📊 Dashboard Overview") # Total balance total_balance = sum(accounts_data[acc]["balance"] for acc in user_data["accounts"]) col1, col2, col3 = st.columns(3) col1.metric("Total Balance", f"${total_balance:,.2f}", "+2.3%") col2.metric("Monthly Income", "$3,850.00", "$350") col3.metric("Monthly Expenses", "$2,145.67", "-$125") st.markdown("---") # Accounts st.subheader("Your Accounts") cols = st.columns(len(user_data["accounts"])) for idx, acc_num in enumerate(user_data["accounts"]): acc = accounts_data[acc_num] with cols[idx]: st.markdown(f"""

{acc['nickname']}

${acc['balance']:,.2f} {acc['currency']}

{acc_num} • {acc['type']}

""", unsafe_allow_html=True) # Recent transactions st.markdown("---") st.subheader("Recent Transactions") for acc_num in user_data["accounts"]: for tx_id in accounts_data[acc_num].get("transactions", []): if tx_id in st.session_state.transactions: tx = st.session_state.transactions[tx_id] amount_class = "positive" if tx["amount"] > 0 else "negative" amount_sign = "+" if tx["amount"] > 0 else "" col1, col2 = st.columns([3, 1]) col1.write(f"**{tx['description']}**") col1.caption(f"{tx['date']} • Account: {acc_num}") col2.markdown(f"${amount_sign}{tx['amount']:,.2f}", unsafe_allow_html=True) st.divider() def show_accounts(): st.title("💰 Accounts") user_data = st.session_state.users[st.session_state.current_user] for acc_num in user_data["accounts"]: acc = st.session_state.accounts[acc_num] with st.expander(f"{acc['nickname']} - ${acc['balance']:,.2f} {acc['currency']}", expanded=True): col1, col2 = st.columns(2) col1.metric("Account Number", acc_num) col2.metric("Account Type", acc['type']) col1.metric("Interest Rate", f"{acc.get('interest_rate', 0.5)}%") col2.metric("Available Balance", f"${acc['balance']:,.2f}") if st.button("Back to Dashboard"): st.session_state.page = "dashboard" st.rerun() def show_transfer(): st.title("💸 Transfer Funds") user_data = st.session_state.users[st.session_state.current_user] with st.form("transfer_form"): col1, col2 = st.columns(2) with col1: from_acc = st.selectbox( "From Account", user_data["accounts"], format_func=lambda x: f"{st.session_state.accounts[x]['nickname']} (${st.session_state.accounts[x]['balance']:,.2f})" ) amount = st.number_input("Amount ($)", min_value=0.01, value=50.00) with col2: to_acc = st.selectbox( "To Account", [acc for acc in user_data["accounts"] if acc != from_acc] ) memo = st.text_input("Memo", "Transfer") if st.form_submit_button("Transfer Now", type="primary"): if amount <= st.session_state.accounts[from_acc]["balance"]: # Update balances st.session_state.accounts[from_acc]["balance"] -= amount st.session_state.accounts[to_acc]["balance"] += amount # Create transaction records tx_id_out = f"TXN{random.randint(100000, 999999)}" tx_id_in = f"TXN{random.randint(100000, 999999)}" st.session_state.transactions[tx_id_out] = { "id": tx_id_out, "date": datetime.datetime.now().strftime("%Y-%m-%d"), "description": f"Transfer to {st.session_state.accounts[to_acc]['nickname']}", "amount": -amount, "account": from_acc } st.session_state.transactions[tx_id_in] = { "id": tx_id_in, "date": datetime.datetime.now().strftime("%Y-%m-%d"), "description": f"Transfer from {st.session_state.accounts[from_acc]['nickname']}", "amount": amount, "account": to_acc } st.session_state.accounts[from_acc]["transactions"].append(tx_id_out) st.session_state.accounts[to_acc]["transactions"].append(tx_id_in) st.success(f"✅ Transfer of ${amount:,.2f} completed!") st.balloons() else: st.error("Insufficient funds!") if st.button("Back to Dashboard"): st.session_state.page = "dashboard" st.rerun() def show_bills(): st.title("📅 Pay Bills") billers = { "Hydro One": 125.67, "Bell Canada": 89.99, "Toronto Water": 45.50, "Property Tax": 320.00, "Credit Card": 450.00 } selected_biller = st.selectbox("Select Biller", list(billers.keys())) col1, col2 = st.columns(2) col1.metric("Biller", selected_biller) col2.metric("Amount Due", f"${billers[selected_biller]:,.2f}") if st.button("Pay Now", type="primary", use_container_width=True): st.success(f"✅ Payment of ${billers[selected_biller]:,.2f} to {selected_biller} scheduled!") st.markdown("---") st.subheader("Upcoming Bills") for biller, amount in billers.items(): col1, col2, col3 = st.columns([2, 1, 1]) col1.write(f"**{biller}**") col2.write(f"${amount:,.2f}") col3.button("Pay", key=f"pay_{biller}") if st.button("Back to Dashboard"): st.session_state.page = "dashboard" st.rerun() def show_investments(): st.title("📈 Investments") investments = { "RRSP": {"value": 24500.00, "change": "+3.2%"}, "TFSA": {"value": 18750.00, "change": "+1.8%"}, "Stocks": {"value": 32500.00, "change": "-0.5%"}, "Mutual Funds": {"value": 15600.00, "change": "+2.1%"} } total_value = sum(inv["value"] for inv in investments.values()) st.metric("Total Portfolio Value", f"${total_value:,.2f}", "+1.65%") st.markdown("---") for name, data in investments.items(): col1, col2, col3 = st.columns([2, 1, 1]) col1.write(f"**{name}**") col2.write(f"${data['value']:,.2f}") col3.write(data['change']) st.markdown("---") st.subheader("Quick Actions") col1, col2 = st.columns(2) col1.button("Buy", use_container_width=True) col2.button("Sell", use_container_width=True) if st.button("Back to Dashboard"): st.session_state.page = "dashboard" st.rerun() def show_cards(): st.title("💳 Card Management") cards = [ {"type": "Visa Platinum", "number": "**** 4832", "balance": 1250.00, "status": "Active"}, {"type": "Mastercard Gold", "number": "**** 5917", "balance": 500.00, "status": "Active"}, {"type": "Debit Card", "number": "**** 3268", "balance": "N/A", "status": "Active"} ] for card in cards: with st.expander(f"{card['type']} ({card['number']}) - {card['status']}"): col1, col2, col3 = st.columns(3) col1.metric("Type", card['type']) col2.metric("Status", card['status']) col3.metric("Balance", f"${card['balance']}" if isinstance(card['balance'], (int, float)) else card['balance']) col1, col2 = st.columns(2) col1.button("Lock Card", key=f"lock_{card['number']}") col2.button("Report Lost", key=f"lost_{card['number']}") if st.button("Back to Dashboard"): st.session_state.page = "dashboard" st.rerun() # Main app router def main(): if not st.session_state.authenticated: show_login() else: if st.session_state.page == "dashboard": show_dashboard() elif st.session_state.page == "accounts": show_accounts() elif st.session_state.page == "transfer": show_transfer() elif st.session_state.page == "bills": show_bills() elif st.session_state.page == "investments": show_investments() elif st.session_state.page == "cards": show_cards() if __name__ == "__main__": main()