import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
import pandas as pd
from datetime import datetime, date, time
import os
from arabic_reshaper import reshape
from bidi.algorithm import get_display
import threading
import schedule
import time
class ButcherShopDebtManager:
def __init__(self, root):
self.root = root
self.root.title("برنامج إدارة سلف محل الجزارة")
self.root.geometry("1000x700")
self.root.configure(bg="#f0f0f0")
# تعيين الخط العربي
self.arabic_font = ("Arial", 12)
self.title_font = ("Arial", 16, "bold")
# قائمة السلع المتاحة
self.items = [
"لحم غنم", "لحم بقر", "صوصيص لحم", "صوصيص دجاج", "جناوح",
"فيلي دجاج", "فيلي لحم", "كوطليط", "نوݣيط", "كاشير",
"فرماج احمر", "ملج", "KFC", "بلو", "فخيضات دجاج",
"زيتون", "صوصيص دوفوا", "كبدة", "كفتة دجاج", "كفتة لحم",
"الخليع", "دوارة", "كرعين", "رأس غنم", "رأس بقر", "فوفيلي", "قطبان لحم"
]
# قائمة الأسعار (لكل كيلوغرام)
self.prices = {
"لحم غنم": 100, "لحم بقر": 120, "صوصيص لحم": 90, "صوصيص دجاج": 70, "جناوح": 50,
"فيلي دجاج": 60, "فيلي لحم": 130, "كوطليط": 80, "نوݣيط": 75, "كاشير": 85,
"فرماج احمر": 150, "ملج": 120, "KFC": 65, "بلو": 55, "فخيضات دجاج": 45,
"زيتون": 40, "صوصيص دوفوا": 95, "كبدة": 70, "كفتة دجاج": 75, "كفتة لحم": 110,
"الخليع": 60, "دوارة": 50, "كرعين": 40, "رأس غنم": 80, "رأس بقر": 100, "فوفيلي": 90, "قطبان لحم": 95
}
# اسم ملف Excel الرئيسي
self.excel_file = "سلف_محل_الجزارة.xlsx"
# مجلد التقارير اليومية
self.reports_folder = "تقارير_يومية"
if not os.path.exists(self.reports_folder):
os.makedirs(self.reports_folder)
# وقت التصدير اليومي (الافتراضي 11:59 مساءً)
self.export_time = "23:59"
# إنشاء ملف Excel إذا لم يكن موجودًا
if not os.path.exists(self.excel_file):
self.create_excel_file()
# تحميل البيانات من ملف Excel
self.load_data()
# إنشاء الواجهة الرئيسية
self.create_main_interface()
# بدء مؤشر الترابط للمهام المجدولة
self.start_scheduler()
def create_excel_file(self):
"""إنشاء ملف Excel جديد"""
data = {
"التاريخ": [],
"الوقت": [],
"اسم الشخص": [],
"نوع السلعة": [],
"الوزن (كغ)": [],
"السعر (للكغ)": [],
"المبلغ الإجمالي": [],
"الحالة": []
}
df = pd.DataFrame(data)
df.to_excel(self.excel_file, index=False)
def load_data(self):
"""تحميل البيانات من ملف Excel"""
try:
self.df = pd.read_excel(self.excel_file)
except Exception as e:
messagebox.showerror("خطأ", f"حدث خطأ أثناء تحميل البيانات: {str(e)}")
self.df = pd.DataFrame(columns=["التاريخ", "الوقت", "اسم الشخص", "نوع السلعة", "الوزن (كغ)", "السعر (للكغ)", "المبلغ الإجمالي", "الحالة"])
def save_data(self):
"""حفظ البيانات في ملف Excel"""
try:
self.df.to_excel(self.excel_file, index=False)
except Exception as e:
messagebox.showerror("خطأ", f"حدث خطأ أثناء حفظ البيانات: {str(e)}")
def create_main_interface(self):
"""إنشاء الواجهة الرئيسية"""
# إطار العنوان
title_frame = tk.Frame(self.root, bg="#e0e0e0", pady=10)
title_frame.pack(fill=tk.X)
title_label = tk.Label(title_frame, text="برنامج إدارة سلف محل الجزارة", font=self.title_font, bg="#e0e0e0")
title_label.pack()
# إطار الإحصائيات
stats_frame = tk.LabelFrame(self.root, text="الإحصائيات", font=self.arabic_font, bg="#f0f0f0", padx=10, pady=10)
stats_frame.pack(fill=tk.X, padx=10, pady=5)
self.total_debts_label = tk.Label(stats_frame, text="إجمالي السلف: 0.00 درهم", font=self.arabic_font, bg="#f0f0f0")
self.total_debts_label.grid(row=0, column=0, padx=10, pady=5, sticky="w")
self.paid_debts_label = tk.Label(stats_frame, text="السلف المدفوعة: 0.00 درهم", font=self.arabic_font, bg="#f0f0f0")
self.paid_debts_label.grid(row=0, column=1, padx=10, pady=5, sticky="w")
self.unpaid_debts_label = tk.Label(stats_frame, text="السلف المعلقة: 0.00 درهم", font=self.arabic_font, bg="#f0f0f0")
self.unpaid_debts_label.grid(row=0, column=2, padx=10, pady=5, sticky="w")
# تحديث الإحصائيات
self.update_statistics()
# إframe الأزرار
buttons_frame = tk.Frame(self.root, bg="#f0f0f0", pady=10)
buttons_frame.pack(fill=tk.X)
add_button = tk.Button(buttons_frame, text="إضافة سلفة جديدة", font=self.arabic_font, bg="#4CAF50", fg="white", padx=20, pady=5, command=self.add_debt)
add_button.pack(side=tk.LEFT, padx=10)
edit_button = tk.Button(buttons_frame, text="تعديل حالة السلفة", font=self.arabic_font, bg="#2196F3", fg="white", padx=20, pady=5, command=self.edit_debt_status)
edit_button.pack(side=tk.LEFT, padx=10)
export_button = tk.Button(buttons_frame, text="تصدير تقرير اليوم", font=self.arabic_font, bg="#9C27B0", fg="white", padx=20, pady=5, command=self.export_daily_report)
export_button.pack(side=tk.LEFT, padx=10)
schedule_button = tk.Button(buttons_frame, text="ضبط وقت التصدير", font=self.arabic_font, bg="#FF9800", fg="white", padx=20, pady=5, command=self.set_export_time)
schedule_button.pack(side=tk.LEFT, padx=10)
refresh_button = tk.Button(buttons_frame, text="تحديث البيانات", font=self.arabic_font, bg="#607D8B", fg="white", padx=20, pady=5, command=self.refresh_data)
refresh_button.pack(side=tk.LEFT, padx=10)
# إطار جدول السلف
table_frame = tk.Frame(self.root, bg="#f0f0f0")
table_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
# إنشاء شريط التمرير
scrollbar = ttk.Scrollbar(table_frame)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# إنشاء الجدول
self.tree = ttk.Treeview(table_frame, yscrollcommand=scrollbar.set, selectmode="browse")
scrollbar.config(command=self.tree.yview)
# تعريف الأعمدة
self.tree["columns"] = ("التاريخ", "الوقت", "اسم الشخص", "نوع السلعة", "الوزن (كغ)", "السعر (للكغ)", "المبلغ الإجمالي", "الحالة")
# تنسيق الأعمدة
self.tree.column("#0", width=0, stretch=tk.NO)
self.tree.column("التاريخ", anchor=tk.CENTER, width=100)
self.tree.column("الوقت", anchor=tk.CENTER, width=80)
self.tree.column("اسم الشخص", anchor=tk.CENTER, width=120)
self.tree.column("نوع السلعة", anchor=tk.CENTER, width=120)
self.tree.column("الوزن (كغ)", anchor=tk.CENTER, width=80)
self.tree.column("السعر (للكغ)", anchor=tk.CENTER, width=80)
self.tree.column("المبلغ الإجمالي", anchor=tk.CENTER, width=100)
self.tree.column("الحالة", anchor=tk.CENTER, width=80)
# عناوين الأعمدة
self.tree.heading("#0", text="", anchor=tk.W)
self.tree.heading("التاريخ", text="التاريخ", anchor=tk.CENTER)
self.tree.heading("الوقت", text="الوقت", anchor=tk.CENTER)
self.tree.heading("اسم الشخص", text="اسم الشخص", anchor=tk.CENTER)
self.tree.heading("نوع السلعة", text="نوع السلعة", anchor=tk.CENTER)
self.tree.heading("الوزن (كغ)", text="الوزن (كغ)", anchor=tk.CENTER)
self.tree.heading("السعر (للكغ)", text="السعر (للكغ)", anchor=tk.CENTER)
self.tree.heading("المبلغ الإجمالي", text="المبلغ الإجمالي", anchor=tk.CENTER)
self.tree.heading("الحالة", text="الحالة", anchor=tk.CENTER)
# تعبئة الجدول بالبيانات
self.populate_table()
self.tree.pack(fill=tk.BOTH, expand=True)
# إطار معلومات التصدير التلقائي
info_frame = tk.Frame(self.root, bg="#f0f0f0", pady=5)
info_frame.pack(fill=tk.X)
self.export_info_label = tk.Label(info_frame, text=f"التصدير التلقائي للتقرير اليومي سيتم في الساعة: {self.export_time}", font=self.arabic_font, bg="#f0f0f0")
self.export_info_label.pack()
def populate_table(self):
"""تعبئة الجدول بالبيانات"""
# مسح البيانات الحالية
for i in self.tree.get_children():
self.tree.delete(i)
# إضافة البيانات من DataFrame
for index, row in self.df.iterrows():
status = "تم الدفع" if row["الحالة"] == "تم الدفع" else "لم يُدفع"
self.tree.insert("", "end", values=(
row["التاريخ"],
row["الوقت"],
row["اسم الشخص"],
row["نوع السلعة"],
row["الوزن (كغ)"],
row["السعر (للكغ)"],
row["المبلغ الإجمالي"],
status
))
def update_statistics(self):
"""تحديث الإحصائيات"""
total_debts = self.df["المبلغ الإجمالي"].sum()
paid_debts = self.df[self.df["الحالة"] == "تم الدفع"]["المبلغ الإجمالي"].sum()
unpaid_debts = self.df[self.df["الحالة"] == "لم يُدفع"]["المبلغ الإجمالي"].sum()
self.total_debts_label.config(text=f"إجمالي السلف: {total_debts:.2f} درهم")
self.paid_debts_label.config(text=f"السلف المدفوعة: {paid_debts:.2f} درهم")
self.unpaid_debts_label.config(text=f"السلف المعلقة: {unpaid_debts:.2f} درهم")
def add_debt(self):
"""إضافة سلفة جديدة"""
# إنشاء نافذة جديدة
add_window = tk.Toplevel(self.root)
add_window.title("إضافة سلفة جديدة")
add_window.geometry("400x400")
add_window.configure(bg="#f0f0f0")
# إطار البيانات
data_frame = tk.LabelFrame(add_window, text="بيانات السلفة", font=self.arabic_font, bg="#f0f0f0", padx=10, pady=10)
data_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# اسم الشخص
tk.Label(data_frame, text="اسم الشخص:", font=self.arabic_font, bg="#f0f0f0").grid(row=0, column=0, padx=10, pady=5, sticky="e")
name_entry = tk.Entry(data_frame, font=self.arabic_font)
name_entry.grid(row=0, column=1, padx=10, pady=5, sticky="w")
# نوع السلعة
tk.Label(data_frame, text="نوع السلعة:", font=self.arabic_font, bg="#f0f0f0").grid(row=1, column=0, padx=10, pady=5, sticky="e")
item_var = tk.StringVar()
item_combobox = ttk.Combobox(data_frame, textvariable=item_var, values=self.items, font=self.arabic_font, state="readonly")
item_combobox.grid(row=1, column=1, padx=10, pady=5, sticky="w")
# الوزن
tk.Label(data_frame, text="الوزن (كغ):", font=self.arabic_font, bg="#f0f0f0").grid(row=2, column=0, padx=10, pady=5, sticky="e")
weight_entry = tk.Entry(data_frame, font=self.arabic_font)
weight_entry.grid(row=2, column=1, padx=10, pady=5, sticky="w")
# السعر
tk.Label(data_frame, text="السعر (للكغ):", font=self.arabic_font, bg="#f0f0f0").grid(row=3, column=0, padx=10, pady=5, sticky="e")
price_var = tk.StringVar()
price_entry = tk.Entry(data_frame, textvariable=price_var, font=self.arabic_font)
price_entry.grid(row=3, column=1, padx=10, pady=5, sticky="w")
# تحديث السعر عند اختيار السلعة
def update_price(event):
selected_item = item_var.get()
if selected_item in self.prices:
price_var.set(str(self.prices[selected_item]))
item_combobox.bind("<
Recommendation Apps
Add Comments
Subscribe to:
Post Comments (Atom)