Ads 728x90
recenlt Apps
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("<>", update_price)
# حالة السلفة
tk.Label(data_frame, text="الحالة:", font=self.arabic_font, bg="#f0f0f0").grid(row=4, column=0, padx=10, pady=5, sticky="e")
status_var = tk.StringVar(value="لم يُدفع")
status_combobox = ttk.Combobox(data_frame, textvariable=status_var, values=["تم الدفع", "لم يُدفع"], font=self.arabic_font, state="readonly")
status_combobox.grid(row=4, column=1, padx=10, pady=5, sticky="w")
# إطار الأزرار
buttons_frame = tk.Frame(add_window, bg="#f0f0f0")
buttons_frame.pack(fill=tk.X, padx=10, pady=10)
def save_debt():
name = name_entry.get().strip()
item = item_var.get()
weight_str = weight_entry.get().strip()
price_str = price_entry.get().strip()
status = status_var.get()
if not name or not item or not weight_str or not price_str:
messagebox.showerror("خطأ", "يرجى ملء جميع الحقول")
return
try:
weight = float(weight_str)
price = float(price_str)
total = weight * price
# الحصول على التاريخ والوقت الحاليين
now = datetime.now()
date = now.strftime("%Y-%m-%d")
time = now.strftime("%H:%M:%S")
# إضافة البيانات إلى DataFrame
new_row = {
"التاريخ": date,
"الوقت": time,
"اسم الشخص": name,
"نوع السلعة": item,
"الوزن (كغ)": weight,
"السعر (للكغ)": price,
"المبلغ الإجمالي": total,
"الحالة": status
}
self.df = pd.concat([self.df, pd.DataFrame([new_row])], ignore_index=True)
self.save_data()
# تحديث الواجهة
self.populate_table()
self.update_statistics()
messagebox.showinfo("نجاح", "تمت إضافة السلفة بنجاح")
add_window.destroy()
except ValueError:
messagebox.showerror("خطأ", "يرجى إدخال قيم صحيحة للوزن والسعر")
save_button = tk.Button(buttons_frame, text="حفظ", font=self.arabic_font, bg="#4CAF50", fg="white", padx=20, pady=5, command=save_debt)
save_button.pack(side=tk.LEFT, padx=10)
cancel_button = tk.Button(buttons_frame, text="إلغاء", font=self.arabic_font, bg="#F44336", fg="white", padx=20, pady=5, command=add_window.destroy)
cancel_button.pack(side=tk.LEFT, padx=10)
def edit_debt_status(self):
"""تعديل حالة السلفة"""
# الحصول على السجل المحدد
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("تحذير", "يرجى اختيار سلفة لتعديل حالتها")
return
selected_index = self.tree.index(selected_item[0])
selected_row = self.df.iloc[selected_index]
# إنشاء نافذة جديدة
edit_window = tk.Toplevel(self.root)
edit_window.title("تعديل حالة السلفة")
edit_window.geometry("400x200")
edit_window.configure(bg="#f0f0f0")
# إطار البيانات
data_frame = tk.LabelFrame(edit_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=f"اسم الشخص: {selected_row['اسم الشخص']}", font=self.arabic_font, bg="#f0f0f0").grid(row=0, column=0, padx=10, pady=5, sticky="w")
tk.Label(data_frame, text=f"نوع السلعة: {selected_row['نوع السلعة']}", font=self.arabic_font, bg="#f0f0f0").grid(row=1, column=0, padx=10, pady=5, sticky="w")
tk.Label(data_frame, text=f"المبلغ الإجمالي: {selected_row['المبلغ الإجمالي']:.2f} درهم", font=self.arabic_font, bg="#f0f0f0").grid(row=2, column=0, 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")
status_var = tk.StringVar(value=selected_row['الحالة'])
status_combobox = ttk.Combobox(data_frame, textvariable=status_var, values=["تم الدفع", "لم يُدفع"], font=self.arabic_font, state="readonly")
status_combobox.grid(row=3, column=1, padx=10, pady=5, sticky="w")
# إطار الأزرار
buttons_frame = tk.Frame(edit_window, bg="#f0f0f0")
buttons_frame.pack(fill=tk.X, padx=10, pady=10)
def update_status():
new_status = status_var.get()
# تحديث البيانات في DataFrame
self.df.at[selected_index, "الحالة"] = new_status
self.save_data()
# تحديث الواجهة
self.populate_table()
self.update_statistics()
messagebox.showinfo("نجاح", "تم تحديث حالة السلفة بنجاح")
edit_window.destroy()
update_button = tk.Button(buttons_frame, text="تحديث", font=self.arabic_font, bg="#4CAF50", fg="white", padx=20, pady=5, command=update_status)
update_button.pack(side=tk.LEFT, padx=10)
cancel_button = tk.Button(buttons_frame, text="إلغاء", font=self.arabic_font, bg="#F44336", fg="white", padx=20, pady=5, command=edit_window.destroy)
cancel_button.pack(side=tk.LEFT, padx=10)
def refresh_data(self):
"""تحديث البيانات من ملف Excel"""
self.load_data()
self.populate_table()
self.update_statistics()
messagebox.showinfo("نجاح", "تم تحديث البيانات بنجاح")
def export_daily_report(self):
"""تصدير تقرير اليوم"""
# الحصول على التاريخ الحالي
today = date.today().strftime("%Y-%m-%d")
# تصفية البيانات ليوم اليوم
today_data = self.df[self.df["التاريخ"] == today]
if today_data.empty:
messagebox.showinfo("معلومة", "لا توجد سلف مسجلة ليوم اليوم")
return
# إنشاء اسم الملف
report_filename = f"{self.reports_folder}/تقرير_السلف_{today}.xlsx"
# حفظ البيانات في ملف Excel
try:
today_data.to_excel(report_filename, index=False)
messagebox.showinfo("نجاح", f"تم تصدير تقرير اليوم بنجاح\nتم حفظه في: {report_filename}")
except Exception as e:
messagebox.showerror("خطأ", f"حدث خطأ أثناء تصدير التقرير: {str(e)}")
def set_export_time(self):
"""ضبط وقت التصدير التلقائي"""
# إنشاء نافذة جديدة
time_window = tk.Toplevel(self.root)
time_window.title("ضبط وقت التصدير التلقائي")
time_window.geometry("300x150")
time_window.configure(bg="#f0f0f0")
# إطار البيانات
data_frame = tk.Frame(time_window, bg="#f0f0f0", padx=10, pady=10)
data_frame.pack(fill=tk.BOTH, expand=True)
# وقت التصدير
tk.Label(data_frame, text="وقت التصدير (HH:MM):", font=self.arabic_font, bg="#f0f0f0").grid(row=0, column=0, padx=10, pady=5, sticky="e")
time_entry = tk.Entry(data_frame, font=self.arabic_font)
time_entry.grid(row=0, column=1, padx=10, pady=5, sticky="w")
time_entry.insert(0, self.export_time)
# إطار الأزرار
buttons_frame = tk.Frame(time_window, bg="#f0f0f0")
buttons_frame.pack(fill=tk.X, padx=10, pady=10)
def save_time():
new_time = time_entry.get().strip()
# التحقق من صيغة الوقت
try:
# تحويل الوقت للتحقق من صحته
time_obj = datetime.strptime(new_time, "%H:%M").time()
# تحديث وقت التصدير
self.export_time = new_time
# تحديث العرض
self.export_info_label.config(text=f"التصدير التلقائي للتقرير اليومي سيتم في الساعة: {self.export_time}")
# إعادة جدولة المهام
self.reschedule_tasks()
messagebox.showinfo("نجاح", f"تم ضبط وقت التصدير التلقائي على الساعة {self.export_time}")
time_window.destroy()
except ValueError:
messagebox.showerror("خطأ", "يرجى إدخال وقت بصيغة صحيحة (HH:MM)")
save_button = tk.Button(buttons_frame, text="حفظ", font=self.arabic_font, bg="#4CAF50", fg="white", padx=20, pady=5, command=save_time)
save_button.pack(side=tk.LEFT, padx=10)
cancel_button = tk.Button(buttons_frame, text="إلغاء", font=self.arabic_font, bg="#F44336", fg="white", padx=20, pady=5, command=time_window.destroy)
cancel_button.pack(side=tk.LEFT, padx=10)
def start_scheduler(self):
"""بدء مؤشر الترابط للمهام المجدولة"""
def run_continuously():
while True:
schedule.run_pending()
time.sleep(1)
# جدولة التصدير اليومي
self.reschedule_tasks()
# بدء مؤشر الترابط
thread = threading.Thread(target=run_continuously, daemon=True)
thread.start()
def reschedule_tasks(self):
"""إعادة جدولة المهام"""
# مسح المهام الحالية
schedule.clear()
# جدولة التصدير اليومي
hour, minute = self.export_time.split(":")
schedule.every().day.at(f"{hour}:{minute}").do(self.scheduled_export)
def scheduled_export(self):
"""التصدير المجدول"""
# الحصول على التاريخ الحالي
today = date.today().strftime("%Y-%m-%d")
# تصفية البيانات ليوم اليوم
today_data = self.df[self.df["التاريخ"] == today]
if today_data.empty:
return
# إنشاء اسم الملف
report_filename = f"{self.reports_folder}/تقرير_السلف_{today}.xlsx"
# حفظ البيانات في ملف Excel
try:
today_data.to_excel(report_filename, index=False)
print(f"تم تصدير تقرير اليوم بنجاح في {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
except Exception as e:
print(f"حدث خطأ أثناء تصدير التقرير: {str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = ButcherShopDebtManager(root)
root.mainloop()
Download The Hottest Games Today
Join millions of gamers worldwide and experience the best gaming content available. Fast downloads, easy installation, and unlimited fun!
Get StartedPopular Games
Check out our most downloaded games this month
Why Choose Us
We provide the best gaming experience for our users
⚡
Fast Downloads
Our high-speed servers ensure you get your games quickly without waiting.
🛡️
Virus Free
All our games are thoroughly scanned to ensure 100% safety for your device.
🎮
Huge Collection
Access to thousands of games across all genres for endless entertainment.
Ready to Start Gaming?
Join our community of gamers today and get access to exclusive content and early releases.
Download Now
Published by :
mercalos

Games4u

Baseball 9
⭐ 4.8 (4.2k reviews)
Sports
200 MB
🎮 Baseball 9 MOD – The Premium Unlocked Version!
Get ready for a fast-paced and realistic baseball experience with Baseball 9 MOD – the fully unlocked, premium version that gives you everything you need to dominate the league!
- ✨ What makes this version special?
- ✅ Fully Paid Version – Enjoy all features without any limitations!
- 💰 Unlimited Money / Free Resources – Upgrade your team at full speed.
- 🧢 All Items Unlocked – Players, uniforms, stadiums, and more.
- ⚾ Ad-Free Gameplay – Play without interruptions.
- 🎮 Enhanced Graphics & Performance – Smoother and more enjoyable experience.

Published by :
mercalos
Subscribe to:
Posts (Atom)