import sqlite3 import tkinter as tk from tkinter import ttk, messagebox # --- VERİTABANI İŞLEMLERİ --- def veritabani_kur(): conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() # Tedarikçiler Tablosu cursor.execute(""" CREATE TABLE IF NOT EXISTS tedarikciler ( id INTEGER PRIMARY KEY AUTOINCREMENT, ad_soyad TEXT NOT NULL, telefon TEXT ) """) # Teslimatlar Tablosu cursor.execute(""" CREATE TABLE IF NOT EXISTS teslimatlar ( id INTEGER PRIMARY KEY AUTOINCREMENT, tedarikci_id INTEGER, mal_adi TEXT, miktar REAL, birim_fiyat REAL, toplam_tutar REAL, tarih DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY(tedarikci_id) REFERENCES tedarikciler(id) ) """) conn.commit() conn.close() # --- ARAYÜZ (GUI) UYGULAMASI --- class HesapUygulamasi: def __init__(self, root): self.root = root self.root.title("Tedarikçi & Haftalık Hesap Takip Programı") self.root.geometry("850x600") # Tablar (Sekmeler) self.tabControl = ttk.Notebook(root) self.tab1 = ttk.Frame(self.tabControl) self.tab2 = ttk.Frame(self.tabControl) self.tab3 = ttk.Frame(self.tabControl) self.tabControl.add(self.tab1, text='👤 Tedarikçi Ekle / Listele') self.tabControl.add(self.tab2, text='📦 Mal Girişi Yap') self.tabControl.add(self.tab3, text='💰 Haftalık Hesap Kes') self.tabControl.pack(expand=1, fill="both") self.tab1_tasarla() self.tab2_tasarla() self.tab3_tasarla() # --- SEKME 1: TEDARİKÇİ İŞLEMLERİ --- def tab1_tasarla(self): frame = ttk.LabelFrame(self.tab1, text="Yeni Tedarikçi Kaydı") frame.pack(fill="x", padx=10, pady=10) ttk.Label(frame, text="Adı Soyadı:").grid(row=0, column=0, padx=5, pady=5) self.ent_ad = ttk.Entry(frame) self.ent_ad.grid(row=0, column=1, padx=5, pady=5) ttk.Label(frame, text="Telefon:").grid(row=0, column=2, padx=5, pady=5) self.ent_tel = ttk.Entry(frame) self.ent_tel.grid(row=0, column=3, padx=5, pady=5) btn_ekle = ttk.Button(frame, text="Tedarikçi Kaydet", command=self.tedarikci_ekle) btn_ekle.grid(row=0, column=4, padx=10, pady=5) # Liste self.tree_tedarikci = ttk.Treeview(self.tab1, columns=("ID", "Ad Soyad", "Telefon"), show="headings") self.tree_tedarikci.heading("ID", text="ID") self.tree_tedarikci.heading("Ad Soyad", text="Adı Soyadı") self.tree_tedarikci.heading("Telefon", text="Telefon") self.tree_tedarikci.pack(fill="both", expand=True, padx=10, pady=10) self.tedarikcileri_listele() def tedarikci_ekle(self): ad = self.ent_ad.get() tel = self.ent_tel.get() if ad: conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() cursor.execute("INSERT INTO tedarikciler (ad_soyad, telefon) VALUES (?, ?)", (ad, tel)) conn.commit() conn.close() messagebox.showinfo("Başarılı", f"{ad} başarıyla eklendi.") self.ent_ad.delete(0, tk.END) self.ent_tel.delete(0, tk.END) self.tedarikcileri_listele() self.combo_tedarikci_guncelle() else: messagebox.showwarning("Uyarı", "Lütfen tedarikçi adını girin!") def tedarikcileri_listele(self): for i in self.tree_tedarikci.get_children(): self.tree_tedarikci.delete(i) conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() cursor.execute("SELECT * FROM tedarikciler") for row in cursor.fetchall(): self.tree_tedarikci.insert("", tk.END, values=row) conn.close() # --- SEKME 2: MAL GİRİŞİ --- def tab2_tasarla(self): frame = ttk.LabelFrame(self.tab2, text="Mal Teslimat Kaydı") frame.pack(fill="x", padx=10, pady=10) ttk.Label(frame, text="Tedarikçi Seç:").grid(row=0, column=0, padx=5, pady=5) self.combo_tedarikci = ttk.Combobox(frame, state="readonly") self.combo_tedarikci.grid(row=0, column=1, padx=5, pady=5) ttk.Label(frame, text="Mal Adı:").grid(row=1, column=0, padx=5, pady=5) self.ent_mal = ttk.Entry(frame) self.ent_mal.grid(row=1, column=1, padx=5, pady=5) ttk.Label(frame, text="Miktar (Kg/Adet):").grid(row=2, column=0, padx=5, pady=5) self.ent_miktar = ttk.Entry(frame) self.ent_miktar.grid(row=2, column=1, padx=5, pady=5) ttk.Label(frame, text="Birim Fiyat (TL):").grid(row=3, column=0, padx=5, pady=5) self.ent_fiyat = ttk.Entry(frame) self.ent_fiyat.grid(row=3, column=1, padx=5, pady=5) btn_kaydet = ttk.Button(frame, text="Mal Girişini Kaydet", command=self.mal_girisi_kaydet) btn_kaydet.grid(row=4, column=1, pady=10) self.combo_tedarikci_guncelle() def combo_tedarikci_guncelle(self): conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() cursor.execute("SELECT id, ad_soyad FROM tedarikciler") self.tedarikci_dict = {f"{row[1]} (ID: {row[0]})": row[0] for row in cursor.fetchall()} self.combo_tedarikci['values'] = list(self.tedarikci_dict.keys()) conn.close() def mal_girisi_kaydet(self): secilen = self.combo_tedarikci.get() mal = self.ent_mal.get() try: miktar = float(self.ent_miktar.get()) fiyat = float(self.ent_fiyat.get()) toplam = miktar * fiyat t_id = self.tedarikci_dict[secilen] conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() cursor.execute(""" INSERT INTO teslimatlar (tedarikci_id, mal_adi, miktar, birim_fiyat, toplam_tutar) VALUES (?, ?, ?, ?, ?) """, (t_id, mal, miktar, fiyat, toplam)) conn.commit() conn.close() messagebox.showinfo("Başarılı", f"Teslimat eklendi! Toplam Tutar: {toplam:.2f} TL") self.ent_mal.delete(0, tk.END) self.ent_miktar.delete(0, tk.END) self.ent_fiyat.delete(0, tk.END) except Exception as e: messagebox.showerror("Hata", "Lütfen bilgileri ve sayıları doğru girdiğinizden emin olun!") # --- SEKME 3: HAFTALIK HESAP KESME --- def tab3_tasarla(self): frame_üst = ttk.Frame(self.tab3) frame_üst.pack(fill="x", padx=10, pady=10) btn_hesapla = ttk.Button(frame_üst, text="🔄 Raporu / Hesapları Güncelle", command=self.haftalik_rapor_getir) btn_hesapla.pack(side="left", padx=5) btn_sifirla = ttk.Button(frame_üst, text="⚠️ Ödemeleri Yap & Haftayı Sıfırla", command=self.haftayi_sifirla) btn_sifirla.pack(side="right", padx=5) self.tree_hesap = ttk.Treeview(self.tab3, columns=("ID", "Tedarikçi", "Toplam Alacak"), show="headings") self.tree_hesap.heading("ID", text="Tedarikçi ID") self.tree_hesap.heading("Tedarikçi", text="Adı Soyadı") self.tree_hesap.heading("Toplam Alacak", text="Ödenecek Tutar (TL)") self.tree_hesap.pack(fill="both", expand=True, padx=10, pady=10) self.lbl_genel_toplam = ttk.Label(self.tab3, text="Haftalık Toplam Dağıtılacak Paralar: 0.00 TL", font=("Arial", 12, "bold")) self.lbl_genel_toplam.pack(pady=10) def haftalik_rapor_getir(self): for i in self.tree_hesap.get_children(): self.tree_hesap.delete(i) conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() # Her tedarikçinin toplam alacağını hesapla query = """ SELECT t.id, t.ad_soyad, COALESCE(SUM(tes.toplam_tutar), 0) as toplam FROM tedarikciler t LEFT JOIN teslimatlar tes ON t.id = tes.tedarikci_id GROUP BY t.id """ cursor.execute(query) rows = cursor.fetchall() genel_toplam = 0 for row in rows: self.tree_hesap.insert("", tk.END, values=(row[0], row[1], f"{row[2]:,.2f} TL")) genel_toplam += row[2] self.lbl_genel_toplam.config(text=f"Haftalık Toplam Dağıtılacak Paralar: {genel_toplam:,.2f} TL") conn.close() def haftayi_sifirla(self): cevap = messagebox.askyesno("Onay", "Haftalık ödemeler yapıldı sayılarak tüm teslimat kayıtları silinecek. Emin misiniz?") if cevap: conn = sqlite3.connect("haftalik_hesap.db") cursor = conn.cursor() cursor.execute("DELETE FROM teslimatlar") # Teslimatları temizle, tedarikçiler kalır conn.commit() conn.close() messagebox.showinfo("Sıfırlandı", "Yeni haftaya geçildi. Tüm hesaplar sıfırlandı!") self.haftalik_rapor_getir() # --- UYGULAMAYI BAŞLAT --- if __name__ == "__main__": veritabani_kur() root = tk.Tk() app = HesapUygulamasi(root) root.mainloop()