import tkinter as tk
from tkinter import filedialog, messagebox
import fitz # PyMuPDF
import re
import sqlite3
import os
# ---------- Database Setup ----------
conn = sqlite3.connect('bill_splitter.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS bills (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT,
total_amount REAL,
per_person REAL,
roommates TEXT
)
''')
conn.commit()
# ---------- PDF Total Extractor ----------
def extract_total_from_pdf(file_path):
try:
doc = fitz.open(file_path)
text = ""
for page in doc:
text += page.get_text()
doc.close()
# Try finding the largest ₹/$/Rs. number
amounts = re.findall(r'[\₹\$\₹Rs\. ]?(\d+[,.]?\d*)', text)
float_amounts = [float(a.replace(',', '')) for a in amounts]
return max(float_amounts) if float_amounts else 0.0
except Exception as e:
messagebox.showerror("Error", f"Failed to extract total: {str(e)}")
return 0.0
# ---------- GUI ----------
class BillSplitterApp:
def __init__(self, root):
self.root = root
self.root.title("📄 PDF Bill Splitter")
self.filename = None
# UI Layout
tk.Button(root, text="📂 Upload PDF Bill", command=self.upload_pdf).pack(pady=10)
self.total_var = tk.StringVar()
tk.Label(root, text="💰 Total Amount:").pack()
tk.Entry(root, textvariable=self.total_var, state="readonly").pack(pady=5)
self.roommates_entry = tk.Entry(root)
self.roommates_entry.pack(pady=5)
self.roommates_entry.insert(0, "Enter emails/names comma-separated")
tk.Button(root, text="➗ Split Bill", command=self.split_bill).pack(pady=10)
def upload_pdf(self):
file_path = filedialog.askopenfilename(filetypes=[("PDF Files", "*.pdf")])
if file_path:
self.filename = os.path.basename(file_path)
total = extract_total_from_pdf(file_path)
self.total_var.set(f"{total:.2f}")
def split_bill(self):
total = self.total_var.get()
roommates = self.roommates_entry.get().split(',')
if not total or not roommates or len(roommates) < 1:
messagebox.showerror("Error", "Please upload a PDF and enter roommates.")
return
try:
total = float(total)
per_person = total / len(roommates)
roommates_clean = [r.strip() for r in roommates]
# Save to DB
cursor.execute('''
INSERT INTO bills (filename, total_amount, per_person, roommates)
VALUES (?, ?, ?, ?)
''', (self.filename, total, per_person, ", ".join(roommates_clean)))
conn.commit()
messagebox.showinfo("Success", f"Each roommate pays: ₹{per_person:.2f}")
self.email_roommates(roommates_clean, per_person)
except Exception as e:
messagebox.showerror("Error", str(e))
def email_roommates(self, roommates, amount):
# Mock email reminder
for r in roommates:
print(f"[Email to {r}] Your share: ₹{amount:.2f}")
# ---------- Run ----------
if __name__ == "__main__":
root = tk.Tk()
app = BillSplitterApp(root)
root.mainloop()
No comments:
Post a Comment