python/main.py

137 lines
4.4 KiB
Python

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}")
# 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()