import sqlite3 import matplotlib.pyplot as plt from datetime import datetime # Inicjalizacja bazy danych def init_db(): conn = sqlite3.connect("finance.db") cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL, -- 'income' lub 'expense' amount REAL NOT NULL, category TEXT, date TEXT NOT NULL ) """) conn.commit() conn.close() # Dodawanie transakcji def add_transaction(transaction_type, amount, category): conn = sqlite3.connect("finance.db") cursor = conn.cursor() date = datetime.now().strftime("%Y-%m-%d") cursor.execute(""" INSERT INTO transactions (type, amount, category, date) VALUES (?, ?, ?, ?) """, (transaction_type, amount, category, date)) conn.commit() conn.close() print("Transakcja dodana!") # Przeglądanie historii transakcji def view_transactions(): conn = sqlite3.connect("finance.db") cursor = conn.cursor() cursor.execute("SELECT * FROM transactions ORDER BY date DESC") transactions = cursor.fetchall() conn.close() print("\nHistoria transakcji:") for t in transactions: print(f"{t[0]} | {t[1]} | {t[2]:.2f} | {t[3]} | {t[4]}") # Filtrowanie transakcji def filter_transactions(category=None, start_date=None, end_date=None): conn = sqlite3.connect("finance.db") cursor = conn.cursor() query = "SELECT * FROM transactions WHERE 1=1" params = [] if category: query += " AND category = ?" params.append(category) if start_date: query += " AND date >= ?" params.append(start_date) if end_date: query += " AND date <= ?" params.append(end_date) cursor.execute(query, params) transactions = cursor.fetchall() conn.close() print("\nFiltrowane transakcje:") for t in transactions: print(f"{t[0]} | {t[1]} | {t[2]:.2f} | {t[3]} | {t[4]}") # Wyświetlanie salda def calculate_balance(): conn = sqlite3.connect("finance.db") cursor = conn.cursor() cursor.execute("SELECT SUM(amount) FROM transactions WHERE type = 'income'") income = cursor.fetchone()[0] or 0 cursor.execute("SELECT SUM(amount) FROM transactions WHERE type = 'expense'") expense = cursor.fetchone()[0] or 0 conn.close() balance = income - expense print(f"Saldo konta: {balance:.2f} zł") # Wyświetlanie statystyk def show_statistics(): conn = sqlite3.connect("finance.db") cursor = conn.cursor() cursor.execute("SELECT category, SUM(amount) FROM transactions WHERE type = 'expense' GROUP BY category") data = cursor.fetchall() conn.close() if not data: print("Brak danych do wyświetlenia statystyk.") return categories = [d[0] for d in data] amounts = [d[1] for d in data] plt.bar(categories, amounts) plt.title("Wydatki według kategorii") plt.xlabel("Kategoria") plt.ylabel("Kwota (zł)") plt.show() # Główna pętla programu def main(): init_db() while True: print("\n--- MENU ---") print("1. Dodaj transakcję") print("2. Wyświetl historię transakcji") print("3. Filtruj transakcje") print("4. Pokaż saldo konta") print("5. Wyświetl statystyki") print("6. Wyjście") choice = input("Wybierz opcję: ") if choice == "1": t_type = input("Typ (income/expense): ").strip().lower() amount = float(input("Kwota: ")) category = input("Kategoria: ").strip() add_transaction(t_type, amount, category) elif choice == "2": view_transactions() elif choice == "3": category = input("Kategoria (lub ENTER aby pominąć): ").strip() or None start_date = input("Data początkowa (YYYY-MM-DD, lub ENTER aby pominąć): ").strip() or None end_date = input("Data końcowa (YYYY-MM-DD, lub ENTER aby pominąć): ").strip() or None filter_transactions(category, start_date, end_date) elif choice == "4": calculate_balance() elif choice == "5": show_statistics() elif choice == "6": print("Do widzenia!") break else: print("Nieprawidłowa opcja. Spróbuj ponownie.") if __name__ == "__main__": main()